RecyclerView的使用和与ListView的一些不同之处

来源:互联网 发布:javascript插件dll 编辑:程序博客网 时间:2024/05/16 18:57

对于RecyclerView,我想大家肯定也不陌生,毕竟已经发布很长时间了,本文是为了给小白入门用的,大神可忽略,文中错误或者表达不准确的地方还请各位不吝赐教。

一、AS中使用RecyclerView的准备工作

android studio中使用RecyclerView的准备工作其实很少,只需要一步即可:
File ——-> Project Structure ——-> app———> Dependencies ———> “+” ——->”Library Dependency” ——->搜索”com.android.support:recyclerview”然后选中搜到的那个库 ———>”OK” ———>”OK” 好了,让项目飞一会……

二、RecyclerView的使用

1.在布局文件layout中添加RecyclerView。

<android.support.v7.widget.RecyclerView                  android:id="@+id/recyclerView_shareAPKPackageLikeQQActivity"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></android.support.v7.widget.RecyclerView>

2.在Activity中先找到RecyclerView,然后为其设置布局管理器

    @ViewById(R.id.recyclerView_MainActivity)    protected RecyclerView recyclerView;    recyclerView.setLayoutManager(new LinearLayoutManager(context));

3.现在去创建一个继承自RecyclerView.Adapter的MyRecyclerViewAdapter类,先不要实现内部方法,然后在这个类中添加一个内部类MyViewHolder,
当然继承自RecyclerView.ViewHolder类

public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyViewHolder> {    private Context context;    private String[] itemText;    private int[] itemImg;    /**     * 构造方法     *     * @param context     * @param itemImg     * @param itemText     */    public MyRecycleViewAdapter(Context context, int[] itemImg, String[] itemText) {        this.context = context;        this.itemImg = itemImg;        this.itemText = itemText;    }    /**     * @param parent     * @param viewType     * @return     */    @Override    public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {        final View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false);        MyViewHolder mViewHolder = new MyViewHolder(itemRoot);        return mViewHolder;    }    @Override    public void onBindViewHolder(MyViewHolder holder, int position) {        holder.img.setImageDrawable(context.getResources().getDrawable(itemImg[position]));        holder.text.setText(itemText[position]);    }    @Override    public int getItemCount() {        return itemImg.length;    }    class MyViewHolder extends RecyclerView.ViewHolder {        ImageView img;        TextView text;        public MyViewHolder(View itemView) {            super(itemView);            img = (ImageView) itemView.findViewById(R.id.img_recycleView);            text = (TextView) itemView.findViewById(R.id.tv_recycleView);        }    }}

4.在Activity中创建adapter的对象,然后为RecyclerView设置Adapter,完成。

//        设置适配器        mAdapter = new MyRecycleViewAdapter(context, itemImg, itemText);        recyclerView.setAdapter(mAdapter);




—————————————我是一条安静的分割线—————————————–




以上步骤做完,那么基本的RecyclerView就能够呈现在屏幕上了,但是有这么几点不舒服的地方:
1.点击item没有任何效果,分不清是点击了还是没有
2.需要为item添加点击事件,以便完成后续操作
3.如果我想要item多样式显示效果,我该怎么办呢?

对于问题1,我们可以写一个Drawable,来作为item的背景:

recyclerview_item_bg.xml<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true">        <color android:color="#ff9a9a9a" />    </item>    <item android:state_pressed="false">        <color android:color="#00000000" />    </item></selector>

然后在Adapter类中的onCreateViewHolder方法中为itemRoot设置背景(只需要下面三行代码中的第三行即可):

        final View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false);        MyViewHolder mViewHolder = new MyViewHolder(itemRoot);        itemRoot.setBackground(context.getResources().getDrawable(R.drawable.recyclerview_item_bg));

这样,再点击item的时候你会发现item的背景颜色变化了。

对于问题2,请参考我的另一篇文章,“RecyclerView的item点击事件监听器”地址:http://blog.csdn.net/gxp1182893781/article/details/76736282

对于问题3,我们需要在Adapter类中重写getItemViewType方法:

    @Override    public int getItemViewType(int position) {        return infos.get(position).getType();    }

这里的infos是想要展示的数据构成的Javabean,里面有一个域叫type,用来标识某个特定对象是什么类型的(比如,0表示样式0,1表示样式1…)
注意看,重写后直接让返回值返回了type,然后系统会把这个type传给onCreateViewHolder方法的第二个参数,这样我们就可以根据这个type的值去确定到底要使用哪一个item_cell布局文件了。

    @Override    public MyListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        MyListViewHolder mViewHolder;        if (viewType == 0) {            mViewHolder = new MyListViewHolder(LayoutInflater.from(context).inflate(R.layout.childlist_cell_type0_share_apkpackage_like_qq, parent, false),viewType);        } else {            mViewHolder = new MyListViewHolder(LayoutInflater.from(context).inflate(R.layout.childlist_cell_type1_share_apkpackage_like_qq, parent, false),viewType);        }        return mViewHolder;    }

上面代码中,我们给MyListViewHolder类传入了这个type值,这样ViewHolder就能根据type正确的找到布局文件中的各个控件了。

    public MyListViewHolder(View itemView,int viewType) {        super(itemView);        if (viewType == 0){            icon = itemView.findViewById(R.id.icon_type0_share_apkpackage_like_qq);            name = itemView.findViewById(R.id.name_type0_share_apkpackage_like_qq);            lastUpdateDate = itemView.findViewById(R.id.lastUpdateDate_type0_share_apkpackage_like_qq);            size = itemView.findViewById(R.id.sizePackage_type0_share_apkpackage_like_qq);        }else {            icon = itemView.findViewById(R.id.icon_type1_share_apkpackage_like_qq);            name = itemView.findViewById(R.id.name_type1_share_apkpackage_like_qq);            lastUpdateDate = itemView.findViewById(R.id.lastUpdateDate_type1_share_apkpackage_like_qq);            size = itemView.findViewById(R.id.sizePackage_type1_share_apkpackage_like_qq);        }    }

这样,在之后的onBindViewHolder中为item_cell布局中的各个组件设置显示内容就很轻松了。

通过以上方法,我们就实现了item的多样式显示功能。

最后,一个小注意事项给大家,希望能注意一下:
在ListView的item_cell布局文件中,我们可以随意让最外层布局的宽和高为match_parent或者wrap_content。因为实际在现实的时候会按照wrap_content进行显示,只有给定具体数值时才会按照给定的数值进行显示。
但是RecyclerView来说,如果item_cell的最外层布局的宽或高定义为wrap_content,那么他会像ListView一样正常显示,但是如果定位成match_parent,那么每一个item将要铺满整个父级容器,不会像ListView一样自适应宽高,当然,如果给定具体数值也会按照给定的数值进行显示。

因此,在使用Recyclerview的时候,个人建议,使用wrap_content。

原创粉丝点击