错误的位置列表视图

问题描述:

所以我有回收站视图,显示带有选项的json来搜索该列表。在搜索之前,当点击特定列表项目时,我会获得显示有关该项目详细信息的新活动。问题是当我搜索列表并点击项目时,我得到错误的细节。示例 如果搜索结果位于第一位(顶部列表视图项),当我点击它时,我从搜索前存在的项目获取数据。如何解决这个问题?错误的位置列表视图

DataAdapter.java

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> implements Filterable { 
    private ArrayList<AndroidVersion> mArrayList; 
    private ArrayList<AndroidVersion> mFilteredList; 
    Context ctx; 
    private Context context; 

    public DataAdapter(ArrayList<AndroidVersion> arrayList, Context ctx,Context context) { 
     mArrayList = arrayList; 
     mFilteredList = arrayList; 
     this.ctx = ctx; 
     this.context = context; 
    } 

    @Override 
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false); 
     return new ViewHolder(view,ctx,mFilteredList); 
    } 

    @Override 
    public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) { 

     viewHolder.tv_name.setText(mFilteredList.get(i).getName()); 
     viewHolder.tv_version.setText(mFilteredList.get(i).getVer()); 
     viewHolder.tv_api_level.setText(mFilteredList.get(i).getApi()); 
    } 

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

    @Override 
    public Filter getFilter() { 

     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence charSequence) { 

       String charString = charSequence.toString(); 

       if (charString.isEmpty()) { 

        mFilteredList = mArrayList; 
       } else { 

        ArrayList<AndroidVersion> filteredList = new ArrayList<>(); 

        for (AndroidVersion androidVersion : mArrayList) { 

         if (charString.contains(",")) { 
          String searchChar[] = charString.split(","); 
          for (int i = 0; i < searchChar.length; i++) { 

           if (androidVersion.getApi().toLowerCase().contains(searchChar[i]) || androidVersion 
             .getName() 
             .toLowerCase().contains(searchChar[i]) || androidVersion.getVer().toLowerCase() 
             .contains(searchChar[i])) { 

            filteredList.add(androidVersion); 
           } 
          } 
         } else { 
          if (androidVersion.getApi().toLowerCase().contains(charString) || androidVersion.getName() 
            .toLowerCase().contains(charString) || androidVersion.getVer().toLowerCase() 
            .contains(charString)) { 

           filteredList.add(androidVersion); 
          } 
         } 
        } 

        mFilteredList = filteredList; 
       } 

       FilterResults filterResults = new FilterResults(); 
       filterResults.values = mFilteredList; 
       return filterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 
       mFilteredList = (ArrayList<AndroidVersion>) filterResults.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     private TextView tv_name,tv_version,tv_api_level; 
     ArrayList<AndroidVersion> arrayList = new ArrayList<AndroidVersion>(); 
     Context ctx; 
     public ViewHolder(View view, Context ctx, ArrayList<AndroidVersion> arrayList) { 
      super(view); 

      this.arrayList = arrayList; 
      this.ctx = ctx; 
      view.setOnClickListener(this); 

      tv_name = (TextView)view.findViewById(R.id.tv_name); 
      tv_version = (TextView)view.findViewById(R.id.tv_version); 
      tv_api_level = (TextView)view.findViewById(R.id.tv_api_level); 

     } 

     @Override 
     public void onClick(View v) { 
      int i = getAdapterPosition(); 
      AndroidVersion arrayList = this.arrayList.get(i); 
      Intent intent = new Intent(this.ctx, Details.class); 
      intent.putExtra("name_id",arrayList.getName()); 
      intent.putExtra("version_id",arrayList.getVer()); 
      intent.putExtra("api_level_id",arrayList.getApi()); 
      ((Context) this.ctx).startActivity(intent); 

     } 
    } 

} 

我猜问题是,“ViewHolder”类只初始化一次,你在哪里设置你的“ClickListener”来的意见。但问题是,您将完整的数组传递给“ViewHolder”,并且未将已过滤的数组传递给“ViewHolder”,因为它已初始化一次。因此,当您获得点击位置的数据时,它将返回来自主数组列表的数据,而不是来自已过滤数据的数据。

所以来解决方法,设置您的“ClickListener”在“onBindViewHolder”方法而不是ViewHolder类中查看,因为每次您与列表或数据更改交互时都会调用它。希望它能为你工作。