2017-06-19 159 views
0

所以我有回收站視圖,顯示帶有選項的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); 

     } 
    } 

} 

回答

0

我猜問題是,「ViewHolder」類只初始化一次,你在哪裏設置你的「ClickListener」來的意見。但問題是,您將完整的數組傳遞給「ViewHolder」,並且未將已過濾的數組傳遞給「ViewHolder」,因爲它已初始化一次。因此,當您獲得點擊位置的數據時,它將返回來自主數組列表的數據,而不是來自已過濾數據的數據。

所以來解決方法,設置您的「ClickListener」在「onBindViewHolder」方法而不是ViewHolder類中查看,因爲每次您與列表或數據更改交互時都會調用它。希望它能爲你工作。