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

对于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。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值