欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android RecyclerView的用法

程序员文章站 2022-06-14 11:17:55
...

本博客代码地址:https://github.com/YoungTime/RecyclerViewTest 去往代码地址

要实现Android的列表可以使用ListView,也可以使用GridView,不过RecyclerView却可以同时实现这两种效果。

RecyclerView的库需要引用,有两种方法:

Android RecyclerView的用法

Android RecyclerView的用法

这里选择第一个

Android RecyclerView的用法

Android RecyclerView的用法

然后搜索recyclerview,记得小写。然后点击它,等待

还有一种一种方法比较简单,打开grade文件

Android RecyclerView的用法

添加这一行代码:compile'com.android.support:recyclerview-v7:23.0.1'

Android RecyclerView的用法

这里需要注意的是,你的RecyclerView的版本不能高于appcompat的版本,要不然会编译失败

然后点击编译按钮,等待

Android RecyclerView的用法

以后做Android开发需要导入第三方依赖库也是用这两种方法。

RecyclerView和listView一样,也需要适配器,新建一个类继承自RecyclerView,如果你你列表中的单个板块包含多个view,可以使用泛型ViewHolder。

先新建一个item_recycler.xml文件,来决定每一个item的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="标题" />
    <TextView
        android:id="@+id/tv_item_context"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="内容"
        android:textSize="20sp"/>
    <Button
        android:id="@+id/btn_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按钮"/>
</LinearLayout>

Android RecyclerView的用法

接下来来创建它的适配器,MyRecyclerAdapter.java

//要实现它的三个方法 onCreateViewHolder、onBindViewHolder、getItemCount
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
    //title的值
    private ArrayList<String> titleList = new ArrayList<String>();
    //context的值
    private ArrayList<String> contextList = new ArrayList<String>();
    private Context context;

    //创建构造器
    public MyRecyclerAdapter(Context context,ArrayList<String> titleList,ArrayList<String> contextList){
        this.titleList = titleList;
        this.contextList = contextList;
        this.context = context;
    }

    //创建ViewHolder,导入视图
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler,parent,false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    //绑定视图
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.tvTitle.setText(titleList.get(position));
        holder.tvContext.setText(contextList.get(position));
        //设置Button的点击事件
        holder.btnItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"点击了按钮",Toast.LENGTH_SHORT).show();
            }
        });
    }

    //获取item的数量
    @Override
    public int getItemCount() {
        return titleList.size();
    }


    //移除操作
    public void removeItem(int position){
        titleList.remove(position);
        contextList.remove(position);
        notifyDataSetChanged();
    }
    //添加操作也就很简单了,传入新的标题和内容,调用notifyDataSetChanged()方法

    //使用ViewHolder内部类,来完成view的绑定,进行RecyclerView的优化,不必每一个item都去findViewById
    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tvTitle;
        TextView tvContext;
        Button btnItem;

        public MyViewHolder(final View itemView) {
            super(itemView);
            tvTitle = (TextView) itemView.findViewById(R.id.tv_item_title);
            tvContext = (TextView) itemView.findViewById(R.id.tv_item_context);
            btnItem = (Button) itemView.findViewById(R.id.btn_item);
            //这里可以设置每一个item的点击事件,也可以使用接口回调实现点击事件,大家可以查一下
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
        }
    }
}

接下来是在MainActivity里面进行RecyclerView的设置

public class MainActivity extends AppCompatActivity {

    private ArrayList<String>titleList = new ArrayList<String>();
    private ArrayList<String>contextList = new ArrayList<String>();
    private RecyclerView recyclerView;
    private MyRecyclerAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        recyclerView = (RecyclerView) findViewById(R.id.recycler_main);
        
        //下面manger为设置RecyclerView的布局方式,可以任选一个
        
        LinearLayoutManager manager = new LinearLayoutManager(this);
        //设置横向滑动(需要设置item_recycler.xml的宽),默认纵向滑动
        manager.setOrientation(LinearLayoutManager.HORIZONTAL);

        //设置瀑布流,第一个参数表示列数,第二个表示布局方向
        StaggeredGridLayoutManager lauoutmanager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        
        
        recyclerView.setLayoutManager(manager);
        adapter = new MyRecyclerAdapter(this,titleList,contextList);
        recyclerView.setAdapter(adapter);

    }

    private void init(){
        titleList.add("标题一");
        titleList.add("标题二");
        titleList.add("标题三");
        titleList.add("标题一");
        titleList.add("标题二");
        titleList.add("标题三");
        titleList.add("标题一");
        titleList.add("标题二");
        titleList.add("标题三");
        contextList.add("文本内容一");
        contextList.add("文本内容二");
        contextList.add("文本内容三");
        contextList.add("文本内容一");
        contextList.add("文本内容二");
        contextList.add("文本内容三");
        contextList.add("文本内容一");
        contextList.add("文本内容二");
        contextList.add("文本内容三");
    }
}

RecyclerView默认是没有分割线的,可以自己实现ItemDecoration类,如果你为了简便,推荐使用CardView,方便好看