android - 根据自定义 View 适配器的TAG值获取Item的位置

标签 android android-recyclerview

假设我有一个包含自定义 View 适配器的 RecyclerView。每个项目都有一个隐藏 View ,它的 View 有一个具有不同值的 TAG。例如其中一个隐藏 View ,它的 TAG 包含一个值 hidden01

问题:您如何知道哪个View 具有hidden01 的值?你怎么知道那个项目的哪个位置?或者你如何根据 hidden viewTAG 知道该项目的位置?

更新: 我的适配器只有以下代码,这也是我想要获取该项目位置的地方,请查看最后一个函数 getPositionBaseOnTag

 public class TheRecyclerAdapter extends RecyclerView.Adapter<TheRecyclerAdapter.TheViewHolder> {

    private Context mContext;
    private List<TheData> theDataList;

    public class TheViewHolder extends RecyclerView.ViewHolder{

        TextView theHiddenView;

        public TheViewHolder(View itemView) {
            super(itemView);

            theHiddenView = (TextView) itemView.findViewById(R.id.hiddenView);
        }
    }

    public TheRecyclerAdapter(Context context, List<TheData> theDatalist){
        this.mContext = context;
        this.theDataList = theDatalist;
    }

    @Override
    public TheViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_view_adapter, parent, false);
        return new TheViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final TheViewHolder holder, int position) {
        TheData theData = theDataList.get(position);
        holder.theHiddenView.setTag(theData.getHiddenTag()); //Set the TAG of Hidden View here
    }

    @Override
    public int getItemCount() {
        return theDataList.size();
    }

    public void deletePosition(int position){
        theDataList.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position,theDataList.size());
    }

    public void removeTheItem(){
         deletePosition(getPositionBaseOnTag("my_tag"));
    }

    /***Here where I want to return the position of that Item base on TAG**/
    public int getPositionBaseOnTag(String theTag){
        int itemPosition;

        //Find the View base on TAG
        //Get the Position
        //Done

        return itemPosition;        
    }
}

最佳答案

有两种方法可以做到这一点:

1) 在您的 getPositionBaseOnTag(String theTag) 方法中循环遍历 theDataList,如果 theTag 与 getHiddenTag() 匹配,则返回该索引:

public int getPositionBaseOnTag(String theTag) {
  int length = theDataList.size();
  for (int i = 0; i < length; i ++) {
    if(theDataList.get(i).getHiddenTag().equals(theTag)) {
      return i;
    }
  }
  // unable to find the tag
  return -1;
}

我们在评论链中得出结论,此方法对 Seynal 的需求无效。

2)制作一个pojo来保存标签和位置并将其存储为 View 标签:

将这个内部类添加到 TheRecyclerAdapter:

private class TagPojo {
  int position;
  String tag;

  public TagPojo(int position, String tag) {
    this.position = position;
    this.tag = tag;
  }
}

然后在您的 onBindViewHolder 中执行此操作:

 @Override
    public void onBindViewHolder(final TheViewHolder holder, int position) {
        TheData theData = theDataList.get(position);
        holder.theHiddenView.setTag(new TagPojo(position, theData.getHiddenTag())); //Set the TAG of Hidden View here
    }

你的 getPositionBaseOnTag() 应该是这样的:

public int getPositionBaseOnTag(TagPojo theTag) {
  return theTag.position;
}

此外,我不确定您的代码是如何编译的,但我认为您的 onBindViewHolder 方法需要更正:

 @Override
    public void onBindViewHolder(final TheViewHolder holder, int position) {
        TheData theData = theDataList.get(position);
        holder.theHiddenView.setTag(theData.getHiddenTag()); //Set the TAG of Hidden View here
    }

最后一个挑剔,确保你在某处调用你的 getPositionBaseOnTag() 。现在它看起来没用过。

关于android - 根据自定义 View 适配器的TAG值获取Item的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38172339/

相关文章:

android - 使用折叠工具栏滚动到回收 View 的最后一项

android - 嵌套的 Recyclerview 自行滚动

android - 如何为 Android TV 自定义选定的 RowPresenter

android - packageAllDebugClassesForMultiDex - 重复项 "Escaper.class"

android - 获取 RecyclerView 中第 n 个项目的 x/y 位置

android - 具有多个项目选取框的回收站 View

java - 如何从非 Activity 或 fragment 类的资源文件中获取字符串

java - 重新激活 Activity 后进行调试

android - 如何在 BottomNavigationView 的 menuItem 上隐藏工具提示?

android - 当 setNestedScrollingEnabled 为 false 时,Recyclerview onscrolllistener 不工作