首页 > 解决方案 > 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:单击的项目的图像和上一个单击的项目的图像。我想我需要通过它的位置来获取以前的视图并手动将可见性设置为不可见。

标签: androidandroid-recyclerview

解决方案


recycleView.getChildCount()并且recycleView_parent.getChildAt()只给出只显示屏幕的适配器项目。这意味着如果您的列表有 200 个项目,并且屏幕上仅显示 5 个项目,那么我们只能在recycleView的帮助下找到 5 个项目

我正在使用一个简单的技巧来解决这个问题。

  1. 您可以定义保存持有者对象的 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<>();
     }
    
  2. 然后将持有者保存在Hashmap中

     public void onBindViewHolder(final ViewHolder holder, final int position) {
         if(!holderlist.containsKey(position)){
             holderlist.put(position,holder);
         }
    
  3. 在适配器中创建一个方法。

    public MyListAdapter.ViewHolder getViewByPosition(int position) {
             return holderlist.get(position);
         }
    
  4. 从您的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);
    
     }
    

推荐阅读