RecyclerView解析

强大的RecyclerView,增强版ListView。

自定义布局list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/ic_launcher_round"/>
</LinearLayout>



在activity_main.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="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>



接下来为RecyclerView准备一个适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String>mStringList;
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView mTextView;
        public ViewHolder(View view){
            super(view);
            mTextView = (TextView)view.findViewById(R.id.name);//找到布局textview的id
        }
    }
    public MyAdapter(List<String>strings){
        mStringList = strings;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
        ViewHolder holder = new ViewHolder(view);//使用上面的静态类ViewHolder传入View
        return holder;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mStringList.get(position));//获取list内容再赋值。
    }
    @Override
    public int getItemCount() {
        return mStringList.size();//获取数量
    }
}



这部分代码看上去有点复杂。其实容易理解,首先我们定义了一个内部类ViewHolder,它继承了RecyclerView.ViewHolder,然后在ViewHolder的构造参数内要传入View的参数,这个通常为RecyclerView自定义布局,然后我们可以通过findViewById来找到控件的实例
接下来继续看,MyAdapter继承了RecyclerView.Adapter,这样就不得不重写onCreateViewHolder(),onBindViewHolder()以及getItemCount()的方法。
接下来分析这三个方法:

onCreateViewHolder():
用于创建ViewHolder的实例,我们把自定义的布局(list_item.xml)传进来,然后创建ViewHolder的实例把该view传进来,最后返回ViewHolder的实例。

onBindViewHolder():
用于对RecyclerView内子项的赋值,会在每个子项滚动到屏幕内进行。

getItemCount():
这个方法就简单了,告诉我们RecyclerView内有多少子项。

MainActivty.java:

public class MainActivity extends AppCompatActivity {
    private List<String>mStringList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initStrings();//初始化List的数据
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        MyAdapter myAdapter = new MyAdapter(mStringList);
        recyclerView.setAdapter(myAdapter);
    }
    private void initStrings(){
        for (int i=0;i<50;i++){
            mStringList.add("a");
            mStringList.add("b");
        }
    }
}

initStrings()就不解释了,是来初始化数据的。
LinearLayoutManager是来指定RecyclerView的布局方式,其他都和ListView相似。

效果图:
这里写图片描述

接下来我们实现横向滚动:

修改MainActivity.java:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initStrings();//初始化List的数据
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        //修改
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);//横向
        recyclerView.setLayoutManager(layoutManager);
        //
        MyAdapter myAdapter = new MyAdapter(mStringList);
        recyclerView.setAdapter(myAdapter);
    }

为了方便观察修改list_item.xml LinearLayout的宽度为wrap_content,这里就不贴代码了。

效果图:

这里写图片描述


最后实现点击事件:
注意 ListView的点击事件一般都是点击子项,如果点击子项里的内容,这样实现就很麻烦,而RecylcerView则很方便。
修改MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String>mStringList;
    static class ViewHolder extends RecyclerView.ViewHolder{
        View mView;//添加
        TextView mTextView;
        public ViewHolder(View view){
            super(view);
            mView = view;
            mTextView = (TextView)view.findViewById(R.id.name);//找到布局textview的id
        }
    }
    public MyAdapter(List<String>strings){
        mStringList = strings;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
        final ViewHolder holder = new ViewHolder(view);//使用上面的静态类ViewHolder传入View
        //添加
        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();//获取子项的位置
                Toast.makeText(v.getContext(),mStringList.get(position),Toast.LENGTH_SHORT).show();
            }
        });
        return holder;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mStringList.get(position));//获取list内容再赋值。
    }
    @Override
    public int getItemCount() {
        return mStringList.size();//获取数量
    }
}

效果图:

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值