精华内容
下载资源
问答
  • 安卓列表线性布局

    2018-01-27 10:26:14
    安卓列表线性布局,列表是比较难的部分,是安卓入门的必要技能,通俗易懂的实例,欢迎下载
  • android 安卓 列表项 滑动删除 仿QQ swipeListView
  • 安卓列表播放视频不卡顿eclipse版,用textureview实现,全程滚动不卡顿,模仿微信聊天 界面视频播放,有一点小bug,希望大家自己修改 ,并给出解决方案,谢谢
  • 安卓列表使用demo

    2018-11-12 19:04:26
    安卓开发中的listview样例,下载之后可以直接运行,平台是Android studio
  • CSS列表式布局实例
  • 安卓 列表listview

    2017-11-22 19:23:34
    当内容超过屏幕大小的时候,我们需要让屏幕容纳足够的展示,所以我们引入了一个控件,可滑动的控件,当然这里可以使用scorlview,scorlview里面只有有一个孩子,只能放一个布局,不过现在介绍一种专用的列表展示的...

              当内容超过屏幕大小的时候,我们需要让屏幕容纳足够的展示,所以我们引入了一个控件,可滑动的控件,当然这里可以使用scorlview,scorlview里面只有有一个孩子,只能放一个布局,不过现在介绍一种专用的列表展示的view,listview。下面看如何使用

    1.listview在xml中设置非常简单,只需设置一下宽和高。只有一个listview

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    
        >
    
    
        <TextView
            android:id="@+id/Retorytext4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="" />
        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
       
    </LinearLayout>
              二.下面介绍listview的适配器,一共有四种:1.Arrayadpter,单一的适配器,里面只能放String 。2.Simpleadapter,里面放图和字,要求数据是map集合,不方便 。3.Cursor适配器,适用展示数据库的数据。4.自定义适配器,继承baseadpter,数据源是任意对象,或者任意集合,展示任意布局,今天要使用的就是自定义适配器。

    三、自定义适配器

    1.首先写一个adapter继承Baseadapter有四个方法,第一个方法是这个代表集合的展示条目的长度

    @Override
        public int getCount()
        {
            return list.size();
        }

    2.第二个方法getItem().不会影响展示,一般用于activty获取适配器的某条数据,一般返回list.get(i)

     @Override
        public Object getItem(int position) {
    
            return null;
        }
    3.第三个方法也不用数据展示,用于Acitvty获取数据库数据的标号
     @Override
        public long getItemId(int position) {
            return 0;
        }

    4.第四个方法最为重要getView,代码也最多,1.代表你要展示的每一条view。2.返回一个view,否则无法展示

          3.必须的操作将数据添加到view布局所包含的控件中,这个方法是将数据和布局进行绑定的方法。

    public View getView(int position, View view, ViewGroup parent) {
        viewHolder viewHolder;
        manager= Playmanager.getinstance();
        final int Position=position;
        if(view==null)
        {
            view=inflater.inflate(R.layout.listitem,null);
            viewHolder=new viewHolder();
            viewHolder.tv1=view.findViewById(R.id.textView4song);
            viewHolder.tv2=view.findViewById(R.id.textViewname);
            viewHolder.imag=view.findViewById(R.id.imageView5);
    
            view.setTag(viewHolder);
    
    
        }
        else
            {
                viewHolder= (ListAdapter.viewHolder) view.getTag();
    
            }
    
    
       final Button btstart= view.findViewById(R.id.start);
        viewHolder.tv1.setText(list.get(position).getSongname());
        viewHolder. tv2.setText(list.get(position).getSingername());
        Picasso.with(context)
                .load(list.get(position).getAlbumpic_small())
                .error(R.mipmap.ic_launcher)
                .placeholder(R.drawable.dibu8)
                .into(viewHolder.imag);
    
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
               list.get(Position).getUrl();
                Log.e("msg","list.get(Position).getUrl()"+list.get(Position).getUrl());
                 manager.cutmusic(list.get(Position).getUrl());
                if ( onclick != null) {
                    onclick.click(1);
                }
    
                Log.e("msg","onclick"+onclick);
    
    
            }
        });
        return view;
    }






    package com.wj.administrator.mcz.Adapter;
    
    import android.content.Context;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.squareup.picasso.Picasso;
    import com.wj.administrator.mcz.JavaBean.josntop;
    import com.wj.administrator.mcz.R;
    import com.wj.administrator.mcz.util.Playmanager;
    
    import java.util.ArrayList;
    
    import static com.wj.administrator.mcz.R.id.imageView;
    
    /**
     * Created by Administrator on 2017/11/1 0001.
     */
    
    public class ListAdapter extends BaseAdapter{
        private ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean> list;
        private LayoutInflater inflater;
        private Context context;
        private Playmanager manager;
        private Button button;
        public ListAdapter(Button button)
        {
               this.button=button;
        }
    
        public  ListAdapter(ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean> list, Context context)
        {
                 this.list=list;
                this.context=context;
                inflater=LayoutInflater.from(context);
        }
        @Override
        public int getCount()
        {
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
    
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
       class viewHolder
       {
           TextView tv1, tv2;
           ImageView imag;
    
    
       }
    
        @Override
        public View getView(int position, View view, ViewGroup parent) {
            viewHolder viewHolder;
            manager= Playmanager.getinstance();
            final int Position=position;
            if(view==null)
            {
                view=inflater.inflate(R.layout.listitem,null);
                viewHolder=new viewHolder();
                viewHolder.tv1=view.findViewById(R.id.textView4song);
                viewHolder.tv2=view.findViewById(R.id.textViewname);
                viewHolder.imag=view.findViewById(R.id.imageView5);
    
                view.setTag(viewHolder);
    
    
            }
            else
                {
                    viewHolder= (ListAdapter.viewHolder) view.getTag();
    
                }
    
    
           final Button btstart= view.findViewById(R.id.start);
            viewHolder.tv1.setText(list.get(position).getSongname());
            viewHolder. tv2.setText(list.get(position).getSingername());
            Picasso.with(context)
                    .load(list.get(position).getAlbumpic_small())
                    .error(R.mipmap.ic_launcher)
                    .placeholder(R.drawable.dibu8)
                    .into(viewHolder.imag);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                   list.get(Position).getUrl();
                    Log.e("msg","list.get(Position).getUrl()"+list.get(Position).getUrl());
                     manager.cutmusic(list.get(Position).getUrl());
                    if ( onclick != null) {
                        onclick.click(1);
                    }
    
                    Log.e("msg","onclick"+onclick);
    
    
                }
            });
            return view;
        }
    
        private Onclick onclick;
        public void setonlist(Onclick listener)
        {
    
            Log.d("TAG","setmItemOnClickListener...");
            this.onclick = listener;
    
        }
       public interface Onclick
        {
            public void click(int v);
        }
    }
    


    4.准备数据,网上下载,list集合,子布局呢哪里来?子布局如何写呢,我们写了个listitem,就是这个xml,就是我们的模板。

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:card_view="http://schemas.android.com/tools"
        android:weightSum="10"
        android:layout_marginLeft="10dp"
    
        >
        <!--<android.support.v7.widget.CardView-->
            <!--android:id="@+id/cardview"-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="wrap_content"-->
            <!--android:layout_margin="14dp"-->
            <!--card_view:cardBackgroundColor="@color/colorAccent"-->
            <!--card_view:cardCornerRadius="10dp"-->
            <!--card_view:cardElevation="5dp"-->
            <!--android:foreground="?attr/selectableItemBackground"-->
            <!--card_view:contentPadding="8dp">-->
            <!--子布局控件-->
            <!--<LinearLayout-->
                <!--android:layout_width="300dp"-->
                <!--android:layout_height="65dp"-->
                <!--android:orientation="horizontal">-->
    
        <ImageView
            android:layout_width="0dp"
            android:layout_height="65dp"
            android:layout_weight="2"
    
            app:srcCompat="@mipmap/ic_launcher_round"
            android:id="@+id/imageView5" />
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="65dp"
            android:orientation="vertical"
    
            android:layout_weight="6">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
    
               android:gravity="bottom"
                android:paddingBottom="5dp"
                android:text="西湖水辅导辅导"
                android:id="@+id/textView4song"
                android:layout_alignParentTop="true"
                android:layout_toRightOf="@+id/imageView5"
                android:layout_toEndOf="@+id/imageView5" />
    
        <TextView
            android:id="@+id/textViewname"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="冰雨"
            android:paddingTop="5dp"
            android:layout_weight="1"
           />
    
            <ImageView
                android:layout_width="320dp"
                android:layout_height="1dp"
                android:background="#ffffff"
                android:paddingTop="10dp"
                android:layout_below="@+id/textViewname" />
    
        </LinearLayout>
    
    
    
    <ImageView
    android:layout_marginTop="10dp"
    android:id="@+id/imageView9"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:layout_marginLeft="30dp"
    android:layout_weight="1"
    android:src="@drawable/xiaosan333"
        />
        <!--</android.support.v7.widget.CardView>-->
    </LinearLayout>
    

    五如何传入数据呢和子布局到这个适配器里面,数据和子布局都是activty提供?

    1.拿布局。利用LayoutInflater,但是需要一个context对象,所以都通过构造传过来。

    private LayoutInflater inflater;
    private Context context;

    public  ListAdapter(ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean> list, Context context)
    {
             this.list=list;
            this.context=context;
            inflater=LayoutInflater.from(context);
    }

    2.现在已经有了布局和数据,那么就可以在加载一个布局,然后找到控件,修改里面的内容,set可以了。

    view=inflater.inflate(R.layout.listitem,null);
    
    
    
    
    //第四个方法很重要很重要
     @Override
        public View getView(int position, View view, ViewGroup parent) {
            viewHolder viewHolder;
            manager= Playmanager.getinstance();
            final int Position=position;
            if(view==null)
            {
                     //加载了这个子布局
                view=inflater.inflate(R.layout.listitem,null);
                viewHolder=new viewHolder();
    //找到这个布局的子控件
                viewHolder.tv1=view.findViewById(R.id.textView4song);
                viewHolder.tv2=view.findViewById(R.id.textViewname);
                viewHolder.imag=view.findViewById(R.id.imageView5);
    
                view.setTag(viewHolder);
    
    
            }
            else
                {
                    viewHolder= (ListAdapter.viewHolder) view.getTag();
    
                }
    
    
           final Button btstart= view.findViewById(R.id.start);
             //  修改子布局的内容
            viewHolder.tv1.setText(list.get(position).getSongname());
            viewHolder. tv2.setText(list.get(position).getSingername());
            Picasso.with(context)
                    .load(list.get(position).getAlbumpic_small())
                    .error(R.mipmap.ic_launcher)
                    .placeholder(R.drawable.dibu8)
                    .into(viewHolder.imag);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                   list.get(Position).getUrl();
                    Log.e("msg","list.get(Position).getUrl()"+list.get(Position).getUrl());
                     manager.cutmusic(list.get(Position).getUrl());
                    if ( onclick != null) {
                        onclick.click(1);
                    }
    
                    Log.e("msg","onclick"+onclick);
    
    
                }
            });
            return view;
        }
    


    六、看fragment代码,获取数据,同时传context,context在framgent中只需要自己加载相应布局一个view就可以拿到final Context context=view.getContext();


    //这个是核心代码

       list1= (ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean>) response.body().getShowapi_res_body().getPagebean().getSonglist();
                    TextView TV=view.findViewById(R.id.Retorytext4);
    
    
    
                   final Context context=view.getContext();
                    list.setAdapter(new ListAdapter(list1,context));
    
    
    //Fragment的全部代码

    public class fram_0 extends Fragment
    {
    
        public View view;
    
        public ListView list;
        public ListAdapter listAdapter;
        
       
        private PlayerActivity activty;
        private int a;
        private Bundle bundle;
        ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean> list1;
    
        PlayerActivity Play;
        @Nullable
        @Override
    
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
        {
    
    
    
            view = inflater.inflate(R.layout.layout_0, container, false);
            list=view.findViewById(R.id.listview);
    
    
            query();
            click();
    
    
            return view;
    
        }
    
    public void set(int a)
    {
        this.a=a;
    
    }
    
        @Override
        public void onAttach(Context context) {
            Log.e("msg","Fragment:onAttach");
            super.onAttach(context);
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            Log.e("msg","Fragment:onCreate");
    
            super.onCreate(savedInstanceState);
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            Log.e("msg","Fragment:onActivityCreated");
            super.onActivityCreated(savedInstanceState);
        }
    
        @Override
        public void onStart() {
            Log.e("msg","Fragment:onStart");
            super.onStart();
        }
    
        @Override
        public void onResume() {
            Log.e("msg","Fragment:onResume");
    
            super.onResume();
        }
    
        @Override
        public void onPause() {
            Log.e("msg","Fragment:onPause");
            super.onPause();
        }
    
        @Override
        public void onStop() {
            Log.e("msg","Fragment:onStop");
            super.onStop();
        }
    
        @Override
        public void onDestroyView() {
            Log.e("msg","Fragment:onDestroyView");
            super.onDestroyView();
    
        }
    
        @Override
        public void onDestroy() {
            Log.e("msg","Fragment:onDestroy");
            super.onDestroy();
        }
    
        @Override
        public void onDetach() {
            Log.e("msg","Fragment:onDetach");
            super.onDetach();
        }
        private void query()
        {
    //        http://route.showapi.com/213-4?showapi_appid=48962&topid=5&showapi_sign=9ad486a2461e47f4b3391171911f5b4b
            //1.创建Retrofit对象
            Retrofit retrofit = new Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create())//解析方法
                    .baseUrl("http://route.showapi.com/")//主机地址
                    .build();
            PlayerActivity.retrofitinter retrofitinter=retrofit.create(PlayerActivity.retrofitinter.class);
            Call<josntop> call=retrofitinter.getResult("48962","5","9ad486a2461e47f4b3391171911f5b4b");
            call.enqueue(new Callback<josntop>() {
                    @Override
                public void onResponse(Call<josntop> call, Response<josntop> response)
                {
    
    
                    list1= (ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean>) response.body().getShowapi_res_body().getPagebean().getSonglist();
                    TextView TV=view.findViewById(R.id.Retorytext4);
    
    
    
                   final Context context=view.getContext();
                    list.setAdapter(new ListAdapter(list1,context));
    
    
    
    
    
    
    
    
                }
    
                @Override
                public void onFailure(Call<josntop> call, Throwable t) {
    
                }
            });
        }
        public interface retrofitinter
        {
            @GET("/213-4/")
            Call<josntop> getResult(@Query("showapi_appid") String showapi_appid, @Query("topid") String topid, @Query("showapi_sign") String showapi_sign);
    
        }
    七、Listview适配器的优化,这是必须的尤其这种大数据展示

    1.第一个优化view的创建,一个是防止每次都将ListView的每一行的布局文件实例化,由于getview会反复调用。打个log就可以知道中间第二参数view的特点,这个view类似于一个循环生成的位置,等于如果第一用这个view,那么会它的值为null,在后面的时候我们会发现2.优化findviewbyid,由于这个非常耗时的,前面已经将xml文件解析出来了,那么

    xml文件被解析的时候,只要被创建出来了,其孩子的id就不会改变了。根据这个特点,可以将孩子id存入到指定的集合中,每次就可以直接取出集合中对应的元素就可以了。这样就可以了

    1、优化一:复用convertView

    Android系统本身为我们考虑了ListView的优化问题,在复写的Adapter的类中,比较重要的两个方法是getCount()和getView()。界面上有多少个条显示,就会调用多少次的getView()方法;因此如果在每次调用的时候,如果不进行优化,每次都会使用View.inflate(….)的方法,都要将xml文件解析,并显示到界面上,这是非常消耗资源的:因为有新的内容产生就会有旧的内容销毁,所以,可以复用旧的内容。

    优化:

    在getView()方法中,系统就为我们提供了一个复用view的历史缓存对象convertView,当显示第一屏的时候,每一个item都会新创建一个view对象,这些view都是可以被复用的;如果每次显示一个view都要创建一个,是非常耗费内存的;所以为了节约内存,可以在convertView不为null的时候,对其进行复用

    2、优化二:缓存item条目的引用——ViewHolder

      findViewById()这个方法是比较耗性能的操作,因为这个方法要找到指定的布局文件,进行不断地解析每个节点:从最顶端的节点进行一层一层的解析查询,找到后在一层一层的返回,如果在左边没找到,就会接着解析右边,并进行相应的查询,直到找到位置(如图)。因此可以对findViewById进行优化处理,需要注意的是:

    》》》》特点:xml文件被解析的时候,只要被创建出来了,其孩子的id就不会改变了。根据这个特点,可以将孩子id存入到指定的集合中,每次就可以直接取出集合中对应的元素就可以了。在参数里面没有控件的位置,只有view,所以没有办法对它进行向view一样判断,这个时候我们可以将它与view绑定起来,如何绑定呢?

    view.setTag(viewHolder);
    class viewHolder
    {
        TextView tv1, tv2;
        ImageView imag;
    
    
    }



    public View getView(int position, View view, ViewGroup parent) 



    @Override
    public View getView(int position, View view, ViewGroup parent) {
        viewHolder viewHolder;
        manager= Playmanager.getinstance();
        final int Position=position;
        if(view==null)
        {
            view=inflater.inflate(R.layout.listitem,null);
            viewHolder=new viewHolder();
            viewHolder.tv1=view.findViewById(R.id.textView4song);
            viewHolder.tv2=view.findViewById(R.id.textViewname);
            viewHolder.imag=view.findViewById(R.id.imageView5);
    
            view.setTag(viewHolder);
    
    
        }
        else
            {
                viewHolder= (ListAdapter.viewHolder) view.getTag();
    
            }
    
    
       final Button btstart= view.findViewById(R.id.start);
        viewHolder.tv1.setText(list.get(position).getSongname());
        viewHolder. tv2.setText(list.get(position).getSingername());
        Picasso.with(context)
                .load(list.get(position).getAlbumpic_small())
                .error(R.mipmap.ic_launcher)
                .placeholder(R.drawable.dibu8)
                .into(viewHolder.imag);
    
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
               list.get(Position).getUrl();
                Log.e("msg","list.get(Position).getUrl()"+list.get(Position).getUrl());
                 manager.cutmusic(list.get(Position).getUrl());
                if ( onclick != null) {
                    onclick.click(1);
                }
    
                Log.e("msg","onclick"+onclick);
    
    
            }
        });
        return view;
    }

    八、同时可以给listview的每一条子条目设置监听多好,就是这么简单

     view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
               list.get(Position).getUrl();
                Log.e("msg","list.get(Position).getUrl()"+list.get(Position).getUrl());
                 manager.cutmusic(list.get(Position).getUrl());
                if ( onclick != null) {
                    onclick.click(1);
                }
    
                Log.e("msg","onclick"+onclick);
    
    
            }
        });
    好了先写到里了,完事走人。


    展开全文
  • iOS列表vs安卓列表

    千次阅读 2012-07-12 18:15:15
    学到ios的表视图,那个编辑模式真心复杂啊。有木有啊,用Iphone的同学们?要移动一行,首先要触发编辑模式,将... 同样是移动列表的一行,在安卓上只需要长按某行,然后拖动到想要的位置即可,省事省心省力。嘿嘿。

          学到ios的表视图,那个编辑模式真心复杂啊。有木有啊,用Iphone的同学们?要移动一行,首先要触发编辑模式,将reorder按钮显示出来,然后按住reorder按钮移动行,完了后按确定关闭编辑模式。这么多的操作,完全不符合最少操作原则,我真不知道iphone的同学是怎么忍受这种操作方式的。

          同样是移动列表的一行,在安卓上只需要长按某行,然后拖动到想要的位置即可,省事省心省力。嘿嘿。

          所以我就想在iphone上实现这样的操作。搞了半天发现用系统现有的UITableView完全没法搞,它就不支持这个。找谷歌大神搞了一把,发现早有人实现了。代码拿过来看了下,真心复杂啊。小小的一个demo,几乎用到了ios大部分的内容。其中委托回调用的太牛擦了。看了N多天的书在这个demo里面还有好多东西不认识。

         正在看这个代码,并且添加注释。作者的代码写的还算清晰,只是很多地方的写法让人很纠结,也许是我刚学ios的缘故吧。

           下载地址

    展开全文
  • 安卓列表字母索引

    2018-04-26 14:02:41
    旁边是有一行的字母索引,当点击字母的时候同时列表也会随之改变 这用到了自定义View 下面看一下我的代码。 public class ContactListView extends RelativeLayout { private RecyclerView recyclerView; ...

    首先看一下效果图
    这里写图片描述
    旁边是有一行的字母索引,当点击字母的时候同时列表也会随之改变
    这用到了自定义View
    下面看一下我的代码。

    
    
    public class ContactListView extends RelativeLayout {
        private RecyclerView recyclerView;
        private SwipeRefreshLayout swipeRefreshLayout;
        public ContactListView(Context context) {
            this(context,null);
        }
    
        public ContactListView(Context context, AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public ContactListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            LayoutInflater.from(context).inflate(R.layout.contact_list_layout, this, true);
            recyclerView=  findViewById(R.id.contact_recyclerView);
            swipeRefreshLayout= (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
            swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.colorAccent));
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public ContactListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            this(context, attrs, defStyleAttr);
    
        }
        public void setAdapter(RecyclerView.Adapter adapter){
            recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
            recyclerView.setAdapter(adapter);
        }
        public void setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener onRefreshListener){
            swipeRefreshLayout.setOnRefreshListener(onRefreshListener);
        }
    
        public void setRefre(boolean b) {
            if (swipeRefreshLayout!=null){
                swipeRefreshLayout.setRefreshing(b);
            }
        }
    

    这里是封装了RecyclerView的刷新事件,下面才是重要的东西

    public class Slidebar extends View {
        private TextView tvFloat;
        private RecyclerView contactRecyclerView;
        private Paint paint;
        private float avgHeight;
        private static final String[] SECTIONS = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S",
        "T","U","V","W","X","Y","Z"};
        private int measuredWidth;
        private int measuredHeight;
    
        public Slidebar(Context context) {
            super(context,null);
        }
    
        public Slidebar(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public Slidebar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView(context);
        }
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public Slidebar(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            this(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_MOVE:
                    showToastAndScroll(event.getY());
                break;
                case MotionEvent.ACTION_UP:
                    if (tvFloat!=null){
                        tvFloat.setVisibility(GONE);
                    }
                    setBackgroundColor(Color.TRANSPARENT);
                    break;
    
            }
            return true;
        }
    
        private void showToastAndScroll(float y) {
            if (tvFloat==null){
                ViewGroup parent = (ViewGroup) getParent();
                tvFloat = parent.findViewById(R.id.tv_float);
                 contactRecyclerView = parent.findViewById(R.id.contact_recyclerView);
            }
            tvFloat.setVisibility(VISIBLE);
            setBackgroundResource(R.drawable.slidebar_bk);
            int index= (int) (y/avgHeight);
            if (index<0){
                index=0;
            }else if (index>SECTIONS.length-1){
                index=SECTIONS.length-1;
            }
            String slideBarSection =SECTIONS[index];
            tvFloat.setText(slideBarSection);
    //        ContactAdapter contactAdapter = (ContactAdapter) contactRecyclerView.getAdapter();
    //        List<String> data = contactAdapter.getDate();
    //        for (int i = 0; i < data.size() ; i++) {
    //            if (StringUtils.getInital(data.get(i)).equals(slideBarSection)){
    //                contactRecyclerView.smoothScrollToPosition(i);
    //            return;}
    //        }
            RecyclerView.Adapter adapter=contactRecyclerView.getAdapter();
            if (!(adapter instanceof SectionIndexer)){
                return;
            }
            SectionIndexer sectionIndexer= (SectionIndexer) adapter;
            //获取真实中的所有的分区
            String[] sections= (String[]) sectionIndexer.getSections();
            //当前用户点击的是J,然后需要找到J在真实分区占的角脚标
            int sectionIndex= Arrays.binarySearch(sections,slideBarSection);
            //根据sections的脚表找到条目的脚标
            if (sectionIndex<0){
                return;
            }
            int positionForSection=sectionIndexer.getPositionForSection(sectionIndex);
            //根据条目的脚标让RecyclerView定位到该位置
            contactRecyclerView.scrollToPosition(positionForSection);
        }
    
        private void initView(Context context) {
            paint=new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(Color.parseColor("#8c8c8c"));
            paint.setTextSize(DensityUtil.sp2px(getContext(),10));
            paint.setTextAlign(Paint.Align.CENTER);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
             measuredWidth = getMeasuredWidth();
             measuredHeight = getMeasuredHeight()-getPaddingBottom();
            avgHeight = (measuredHeight + 0.f) / SECTIONS.length;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            float x=measuredWidth/2;
            for (int i = 0; i <SECTIONS.length ; i++) {
                float y=avgHeight*(i+1);
                canvas.drawText(SECTIONS[i],x,y,paint);
            }
    
        }
    展开全文
  • 无bug完整版 首发
  • 由于安卓并不像网页样,把所有列表项都加载起,而只是把当前需要显示的加载起,所以这个处理方式跟网页、跟 WinForm 还不一样。首先,我们需要给 Adapter 设置一个 int 成员,比如名叫 m_playingIndex用以记录当前...

    d119768cc697bbb0e650728feb9b81e5.png

    如上图,有一个列表,可能很长,有些没显示出来。当点击某一项时该项显示“正在播放”。

    由于安卓并不像网页样,把所有列表项都加载起,而只是把当前需要显示的加载起,所以这个处理方式跟网页、跟 WinForm 还不一样。

    首先,我们需要给 Adapter 设置一个 int 成员,比如名叫 m_playingIndex

    用以记录当前播放项。

    何时给这个 m_playingIndex 赋值呢?就是在 getView 中的 view.setOnClickListener  中。

    然后,在Adapter 的 getView 中根据 m_playingIndex 值显示不同的图标holder.title.setText(datas.get(i).title);

    if (i != m_playingIndex) {

    // 显示正在播放按钮

    }

    else {

    // 显示播放按钮

    }

    这个是在滚动时触发的,也就是说为了保证滚动时也能够在正确的位置显示正确的按钮。

    最后,需要一个立即响应事件处理

    第二步说了,那个只是在滚动时触发,不滚动时不触发,也就无法更新界面,那么我们需要在点击了之后也更新。

    那我们就需要 Adapter 设置一个事件了,在前面为 m_playingIndex 赋值后,就触发这个事件,这个事件交由 Activity 中处理(因为我们要用 m_listView,所以用事件跳出 Adapter)。int visibleFirstPos = m_listView.getFirstVisiblePosition();

    int visibleLastPos = m_listView.getLastVisiblePosition();

    for (int i = visibleFirstPos; i <= visibleLastPos; i++) { // 注意 i <=

    View view = m_listView.getChildAt(i - visibleFirstPos); // i 是指数据项 index,但并不一定与 listView 的控件项一一对应,所以这里 - visibleFirstPos

    ViewHolder holder = (ViewHolder)view.getTag();

    if (m_listViewAdapter.m_playingIndex == i) {

    // 显示正在播放按钮

    }

    else {

    // 显示播放按钮

    }

    }

    关于事件,可以参见本连载前面的文章。

    展开全文
  • 安卓列表复选框

    2013-07-03 22:58:20
    本程序实现了listView的item右侧添加复选框的实力,实现全选、全不选等功能,大家可以借鉴下~,有问题欢迎指正。
  • 想要实现一个listview初始化时和数据变化后显示到列表的最末,简单地说就是像聊天窗或者是日志输出那样的情景。 开始没去仔细看listview对象的属性,按照惯性思维就去 调用 listView.scrollTo(offset_x,offset_y); ...
  • 怎么让listview滑到最底部。 我想写个对话框列表。 每次重新加载所有内容。 但现在每次更新,listview就会滑到顶部。
  • android:layout_width="match_parent" android:layout_height="0.2dp" android:layout_marginLeft="@dimen/padding_15" android:layout_marginRight="@dimen/padding_15" android:backgro
  • Android_listview_video安卓列表视频直接播放

    千次阅读 多人点赞 2016-10-28 19:44:38
    列表中的视频播放问题基本解决,还剩下视频自己的问题:第二次按同一个item时,要让这个视频停止,这个事件放在哪里呢?当然也是在视频控件表面的图片控件的点击事件里。也就是这种事件:如果点击的时候mediaplayer...
  • 安卓应用列表

    2015-06-17 14:56:31
    简单的安卓应用列表源代码,跟我一样的菜鸟们可以学习学习
  • 安卓语言列表

    2014-11-10 16:24:17
    里面列出安卓所支持的语言列表,开发者可以自己创建value文件夹来设置对应语言
  • 安卓系统列表LigaInggris
  • 安卓自定义列表dialog

    千次阅读 2019-02-16 09:35:30
    这个形式也是最常用的,不过最近需要用到列表信息Dialog,原生的不光样式不能满足需求,而且是开发电视端的APP,需要对焦点进行特殊处理,所以就需要自定义Dialog 我们先来看一下系统自带的列表Dialog。 系统...
  • 安卓下拉列表

    2020-05-08 09:39:33
    下拉列表—Spinner 有两种实现方式 通过java代码 XML属性 先在XML中设置Spinner组件 java代码方式: 获取数据 绑定适配器 Spinner组件的引用设置适配器 <Spinner android:id="@+id/sp_city" ...
  • 安卓双层列表ExpandableListViewDemo使用,类似于qq分组。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,712
精华内容 1,484
关键字:

安卓列表