【Android开发经验】-- 如何实现RecyclerView子项的点击事件?
目录
实例
实现思路
实现代码
进一步需求:数据库存储
实例
假设现在需要完成一个以下需求的任务,下面两个图左边是点击前未完成,右边是点击后已完成,如何实现点击图标切换另一个图标?(矩形框中的内容是RecyclerView实现,每一行的文字和图标部分是RecyclerView的子项)
实现思路
在适配器adapter类中的onCreateViewHold方法中为ImageView视图注册点击事件,
通过 holder.getAbsoluteAdapterPosition() 方法获取点击的子项,通过子项拿到对应的类的实例,
然后判断点击的ImageView视图是完成还是未完成,例:如果是完成状态,则改变显示图标为未完成且修改实例里保存的图标为未完成。
实现代码
RecyclerView适配器类中实现如下代码,其中isFinish为获取的图标视图(isFinish = (ImageView) view.findViewById(R.id.isFinish);)
plans为自己的需求定义的类,list为传入适配器的列表。
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,parent,false);
final ViewHolder holder = new ViewHolder(view);
holder.isFinish.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int position = holder.getAbsoluteAdapterPosition();
plans status = list.get(position);
if (status.getIsFinish() == R.drawable.finish){
holder.isFinish.setImageResource(R.drawable.unfinish);
status.setIsFinish(R.drawable.unfinish);
}else{
holder.isFinish.setImageResource(R.drawable.finish);
status.setIsFinish(R.drawable.finish);
}
}
进一步需求:数据库存储
以上实现了静态页面,点击会切换图标,但是退出页面再进入时会回到原始状态,那么如何实现记忆存储?下面使用SQLite数据库存储实现,不会使用可参考此文章
由完成状态转变为未完成状态时,修改数据库中的字段isFinish为0,字段isFinish来保存是否完成,0表示未完成,1表示已完成。下次加载此页面时就可以根据字段来判断显示完成还是未完成状态了。
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,parent,false);
final ViewHolder holder = new ViewHolder(view);
dbHelper = new MyDatabaseHelper(parent.getContext(), "MyPlans.db", null, 5);
holder.isFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAbsoluteAdapterPosition();
Plans status = list.get(position);
dbHelper.getWritableDatabase();
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
if (status.getIsFinish() == R.drawable.finish){
holder.isFinish.setImageResource(R.drawable.unfinish);
status.setIsFinish(R.drawable.unfinish);
values.put("isFinish",0);
}else{
holder.isFinish.setImageResource(R.drawable.finish);
status.setIsFinish(R.drawable.finish);
values.put("isFinish",1);
}
db.update("Status",values,"content = ?",new String[] {status.getText()});
}
});
return holder;
}