Android-RecyclerView使用方法及注意事项

  1. 添加依赖
    在app:目录下的build.gradle加入design库的依赖,因为我们所用的RecyclerView来自于该库。
    implementation 'com.android.support:design:28.0.0'
  2. 在布局文件中添加RecyclerView
    注意:该RecyclerView所属的包类别
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.recyclerview.widget.RecyclerView>
  1. 添加适配器
    此处以在该RecyclerView所在活动内添加内部类适配器为例,由于在改变控件值时,我们很可能会用到该RecyclerView所在活动的对象资源,所以将其作为内部类创建在该RecyclerView所在活动中对后续处理会有帮助。

此处示例背景:建立一个BookEntity实体类,用于保存、填充每一子项控件显示的值

 //内部类适配器
    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
        List<BookEntity> bookEntityList = null;

       //该类的作用主要在于找到对应的控件对象,并将其保存在View对象中
        public  class MyViewHolder extends RecyclerView.ViewHolder {
            // each data item is just a string in this case
            View bookView;
            public TextView textNumber;
            public TextView textAuthor;
            public MyViewHolder(View v) {
                super(v);
                bookView = v;
                textNumber = v.findViewById(R.id.recycler_number);
                textAuthor = v.findViewById(R.id.recycler_author);
                textTitle = v.findViewById(R.id.recycler_title);
                textPublisher = v.findViewById(R.id.recycler_publisher);
            }
        }

        // Provide a suitable constructor (depends on the kind of dataset)
        //此处的构造方法一般用于穿List对象赋值
        public MyAdapter( List<BookEntity> bookEntityList) {
            this.bookEntityList = bookEntityList;
        }
        
        //用于更新RecylerView(不是必须的重载方法)
        public void notify(List<BookEntity> bookEntityList){
            this.bookEntityList = bookEntityList;
            this.notifyDataSetChanged();
        }
        
		//在该方法中设置各种点击事件
        // Create new views (invoked by the layout manager)
        @NonNull
        @Override
        public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // create a new view
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false);
            final MyAdapter.MyViewHolder holder = new MyAdapter.MyViewHolder(view);
            holder.bookView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                    dialog.setTitle("提示框");
                    dialog.setMessage("你确定要删除这些信息?");
                    dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            int position = holder.getAdapterPosition();
                            BookEntity book1 = bookEntityList.get(position);
                            dbUtils.deleteBook(book1);
                            bookEntityList = dbUtils.getBooks();
                            notifyDataSetChanged();
                        }
                    });
                    dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
                    dialog.show();
                    return false;
                }
            });
            return holder;
        }
        
        //在该方法中设置控件显示的值
        // Replace the contents of a view (invoked by the layout manager)
        @SuppressLint("SetTextI18n")
        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
            // - get element from your dataset at this position
            BookEntity bookEntity = bookEntityList.get(position);
            holder.textNumber.setText(Math.toIntExact(bookEntity.getId())+"");
            holder.textAuthor.setText(bookEntity.getAuthor());
            holder.textTitle.setText(bookEntity.getBookName());
            holder.textPublisher.setText(bookEntity.getPublisher());
        }
      
        //返回List对象长度,即是返回有多少个子项
        // Return the size of your dataset (invoked by the layout manager)
        @Override
        public int getItemCount() {
            return bookEntityList.size();
        }
    }

RecyclerView的适配器内容核心在于理解MyViewHolder类的意义以及这四个重载方法的含义。

public  class MyViewHolder extends RecyclerView.ViewHolder
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position)
public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) 
public int getItemCount()
  1. 在该RecyclerView所在活动onCreate(Bundle savedInstanceState)中设置
        RecyclerView recyclerView = findViewById(R.id.recycler);
        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        recyclerView.setHasFixedSize(true);
        // use a linear layout manager
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(layoutManager);//设置布局格式
        // specify an adapter (see also next example)
        final MyAdapter mAdapter = new MyAdapter(bookEntityList);
        recyclerView.setAdapter(mAdapter);//添加适配器

此处的bookEntityList是准备填充进RecylerView每一子项的List对象

final MyAdapter mAdapter = new MyAdapter(bookEntityList);
List<BookEntity> bookEntityList = new ArrayList<>();
  1. 注意事项
    (1).notifyDataSetChanged()方法无效:检查在适配器中设置控件值的List对象的值是否改变,是否在该RecyclerView所在活动中改变了List对象的值,却并没有同步修改适配器中List对象的值,因为调用该方法后,RecylerView在刷新时引用的是原来在适配器中的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值