通过recyclerView实现列表显示

前期

首先我并没有学习过ListView,但是RecyclerView更加强大,虽然我暂时用不到其动画功能,并且两者都能实现目前我需要的功能,但学了稍为复杂的RecyclerView想要入手ListView也不是件难事,因此,我选择RecyclerView来显示对应项目。

RecyclerView运行原理

  • 1.RecyclerView通过Adapter子类和ViewHolder子类共同实现数据的列表显示
  • 2.ViewHolder是视图的容器。
  • 3.RecyclerView通过onCreateViewHolder创建ViewHolder,再由ViewHolder创建每个列表项目的视图,之后用bindViewHolder同步数据,同时,RecyclerView不会一直创建ViewHolder,一旦他创建了够用的ViewHolder,就会停止创建ViewHolder,转而通过回收旧的ViewHolder,并调用bindViewHolder更新数据来做到循环往复。
  • 4.Adapter是控制器,他起到了RecyclerView与ViewHolder之前沟通桥梁的作用。关于Adapter 与 RecyclerView的通信,用下图表示
    • 首先RecyclerView请求Adapter调用中的getItemCount()来获取Item的数量,在此获得数量100
    • 获取数量后,RecyclerView通过Adapter调用creatViewHolder()来获取ViewHolder
    • 获取ViewHolder后调用Adapter中bindViewHolder(…, 0)来绑定对应的数据,这样就创建好了一个子项视图并完成数据绑定,其中参数中的‘0’表示第几个项目,这里是第一个。
    • 后面就继续执行createViewHolder(…),以及bingViewHolder (…, 1)来继续创建。

这里写图片描述
图片来自《android编程权威指南》第九章

代码示例

RecyclerView布局

activity_main.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.seth.list.music.testrecyclerview.MainActivity">

    <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/text_recycler_view"/>

</RelativeLayout>

item_text.xml

<?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="wrap_content">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/list_items"
        android:textSize="16sp"/>

</LinearLayout

</RelativeLayout>

ItemAdapter.class

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.TextHolder> {
    private Context mContext;
    private List<String> texts;
    public  MyAdapter(Context context, List<String> textInfo){
        mContext = context;
        texts = textInfo;
    }

    @Override
    public TextHolder onCreateViewHolder(ViewGroup parent, int viewType) {          //创建viewholder
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item_text, parent, false);            //获取视图

        return new TextHolder(view);
    }

    @Override
    public void onBindViewHolder(TextHolder holder, int position) {                 //绑定数据
        String mtext = texts.get(position);

        holder.bindText(mtext);
    }

    @Override
    public int getItemCount() {                             //获取项目数量
        return texts.size();
    }

    public static class TextHolder extends RecyclerView.ViewHolder{
        private TextView mTextView;

        public TextHolder(View itemView) {
            super(itemView);

            mTextView = (TextView) itemView.findViewById(R.id.list_items);
        }
        public void bindText(String mText){
            mTextView.setText(mText);
        }
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {

    private RecyclerView MyRecyclerView;
    private MyAdapter mMyAdapter;
    private List<String> textInfos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyRecyclerView = (RecyclerView) findViewById(R.id.text_recycler_view);
        MyRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        textInfos = TextInit();             //初始化字符串list

        upDateAdapter();
    }

    private List<String> TextInit() {
        List<String> text = new ArrayList<>();      //模拟一百条数据

        for(int i=0; i<100; ++i){
            String itemText = "";
            itemText = "第" + (i+1) + "条数据";
            text.add(itemText);
        }

        return text;
    }

    private void upDateAdapter() {              //新建调用Adapter
        mMyAdapter = new MyAdapter(this, textInfos);    
        MyRecyclerView.setAdapter(mMyAdapter);
    }
}

结果预览

这里写图片描述

暂且实现如此

小结

大概学会了RecyclerView的简单调用,关于各个item点击事件的实现还未熟练,下次学习实现。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值