- 添加依赖
在app:目录下的build.gradle加入design库的依赖,因为我们所用的RecyclerView来自于该库。
implementation 'com.android.support:design:28.0.0'
- 在布局文件中添加RecyclerView
注意:该RecyclerView所属的包类别
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
- 添加适配器
此处以在该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()
- 在该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).notifyDataSetChanged()方法无效:检查在适配器中设置控件值的List对象的值是否改变,是否在该RecyclerView所在活动中改变了List对象的值,却并没有同步修改适配器中List对象的值,因为调用该方法后,RecylerView在刷新时引用的是原来在适配器中的对象。