android - RecyclerView 按位置获取视图
问题描述
我有一个RecyclerView
,每个都CardView
包含一个TextView
和一个ImageView
。每当我单击一个项目时,我想将图像可见性设置为可见,并将先前单击的项目图像的可见性设置为不可见。
这是我的适配器类:
public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder>{
private Context context;
private List<Category> lista;
private LayoutInflater layoutInflater;
private IncomeCategoryActivity activity;
private static final int CATEGORY_REQUEST=6;
private static final int ITEM_EDIT=1;
private static final int ITEM_DELETE=2;
private static final int EDIT_REQUEST=7;
private int current_pos=-1;
public CategoryAdapter(List<Category> lista, Context context, IncomeCategoryActivity activity) {
this.context = context;
this.lista = lista;
this.activity=activity;
layoutInflater=LayoutInflater.from(context);
}
@Override
public CategoryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=layoutInflater.inflate(R.layout.category_layout, parent, false);
ViewHolder viewHolder=new ViewHolder(view, activity);
return viewHolder;
}
@Override
public void onBindViewHolder(CategoryAdapter.ViewHolder holder, int position) {
holder.imageView.setImageURI(lista.get(position).getUri());
holder.textView.setText(lista.get(position).getCategory());
holder.position = position;
holder.category=lista.get(position);
if(holder.category.isChecked()==true){
holder.imageViewCheck.setVisibility(View.VISIBLE);
current_pos=position;
} else {
holder.imageViewCheck.setVisibility(View.INVISIBLE);
}
}
@Override
public int getItemCount() {
return lista.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener{
public ImageView imageView;
public TextView textView;
public ImageView imageViewCheck;
public int position;
public Category category;
public IncomeCategoryActivity activity;
public ViewHolder(View itemView, IncomeCategoryActivity activity) {
super(itemView);
this.activity=activity;
imageView=itemView.findViewById(R.id.customCategoryImageView);
textView=itemView.findViewById(R.id.customCategoryTextView);
imageViewCheck=itemView.findViewById(R.id.customCheckImageView);
itemView.setOnClickListener(this);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public void onClick(View v) {
String aux=textView.getText().toString();
if(aux=="CATEGORIE NOUĂ"){
Intent intent=new Intent(context, CustomIncomeActivity.class);
activity.startActivityForResult(intent, CATEGORY_REQUEST);
}
else{
imageViewCheck.setVisibility(View.VISIBLE);
int pozitie_check=getLayoutPosition();
Intent intent=new Intent(context, AddIncomeActivity.class);
intent.putExtra("categorie_venit", aux);
intent.putExtra("position_check", pozitie_check);
activity.setResult(Activity.RESULT_OK, intent);
activity.finish();
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Selectează acțiunea");
MenuItem edit=menu.add(0, ITEM_EDIT, 0, "Modifică");
MenuItem delete=menu.add(0, ITEM_DELETE, 0, "Șterge");
edit.setOnMenuItemClickListener(this);
delete.setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
int position=getLayoutPosition();
if (item.getGroupId() == 0) {
if(item.getItemId()==ITEM_EDIT){
Category category=lista.get(position);
Intent intent=new Intent(activity, CustomIncomeActivity.class);
intent.putExtra("edit_icon", category.getUri());
intent.putExtra("edit_category", category.getCategory());
intent.putExtra("list_position", position);
activity.startActivityForResult(intent, EDIT_REQUEST);
}
else if(item.getItemId()==ITEM_DELETE){
lista.remove(position);
notifyDataSetChanged();
}
}
return true;
}
此时,每当我单击一个项目时,都会出现两个图像 VISIBLE RecyclerView
:单击的项目的图像和上一个单击的项目的图像。我想我需要通过它的位置来获取以前的视图并手动将可见性设置为不可见。
解决方案
recycleView.getChildCount()
并且recycleView_parent.getChildAt()
只给出只显示屏幕的适配器项目。这意味着如果您的列表有 200 个项目,并且屏幕上仅显示 5 个项目,那么我们只能在recycleView的帮助下找到 5 个项目
我正在使用一个简单的技巧来解决这个问题。
您可以定义保存持有者对象的 Hashmap
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { ArrayList<Model> dataList; Context context; HashMap<Integer,ViewHolder> holderlist; public MyAdapter(ArrayList<Model> dataList, Context context) { this.context = context; this.dataList = dataList; holderlist = new HashMap<>(); }
然后将持有者保存在Hashmap中
public void onBindViewHolder(final ViewHolder holder, final int position) { if(!holderlist.containsKey(position)){ holderlist.put(position,holder); }
在适配器中创建一个方法。
public MyListAdapter.ViewHolder getViewByPosition(int position) { return holderlist.get(position); }
从您的Activity或您想要的任何时候调用此方法。
for (int i = 0; i < datalList.size(); i++) { MyAdapter.ViewHolder holder = ((MyAdapter)recycleView.getAdapter()).getViewByPosition(i); View view = holder.itemView; TextView tv = view.findViewById(R.id.tv); }
推荐阅读
- python - pandas中map函数的使用
- c++ - Should I have two headers for both a) all the forward declarations AND b) the public functions
- python - 如何将颜色选择菜单放在聊天上方?(tkinter)
- scilab - Scilab 的 LJ 潜力
- mysql - 在MYSQL中将一个表列链接到另一个表并自动填充表中的列数据
- c# - 我正在尝试从 xamarin android c# 将数据发送到外部 PHP 脚本
- reactjs - React redux 返回未知状态对象
- c# - 停止/中止一个类循环线程,C#
- php - 为什么 PHP 在 unset() 声明类型属性后调用 __set()?
- python - Python:附加 JSON 并获得太多花括号