0

私はRecyclerView & EditTextを持っています。 RecyclerViewから項目を選択できます。&は、フィルタリングされていない限り、正しい項目を取得します。 EditTextに入力すると、RecyclerViewリストは、リストから項目を選択すると、&というフィルタリングを受けます。選択した項目の代わりに実際のリスト項目を表示します。recyclerviewを使用してフィルタリングされたリストから間違ったアイテムを選択しました

断片クラス:

public class RegionListFragment extends DialogFragment implements View.OnClickListener, 
      OnRecylerViewClickable { 

     private RecyclerView regionRecyclerView; 
     private ArrayList<RegionDetail> regionDetailArrayList = new ArrayList<>(); 
     private GenericRegionListAdapter genericRegionListAdapter; 
     private Context context = this.getActivity(); 
     private RecyclerView.LayoutManager mLayoutManager; 
     private View view; 
     private EditText editTextSearchView; 
     private DatabaseHandler spcl_databaseHandler; 

     @Nullable 
     @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
      view = inflater.inflate(R.layout.spinner_fragment_list_screen, container, false); 

databaseHandler = new DatabaseHandler(getActivity()); 
      regionDetailArrayList = (ArrayList<RegionDetail>) spcl_databaseHandler.getAllRegionDetails(); 

      editTextSearchView = (EditText) view.findViewById(R.id.search); 
      editTextSearchView.setHint(getString(R.string.region_search_hint)); 
      mLayoutManager = new LinearLayoutManager(context); 
      regionRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_Locations); 
      regionRecyclerView.setLayoutManager(mLayoutManager); 
      relativeLayoutBottom = (RelativeLayout) view.findViewById(R.id.rlBottom); 

      genericRegionListAdapter = new GenericRegionListAdapter(context, regionDetailArrayList, this, false); 
      regionRecyclerView.setAdapter(genericRegionListAdapter); 

      addTextListener(); 

      return view; 
     } 

     public void addTextListener(){ 
      editTextSearchView.addTextChangedListener(new TextWatcher() { 
       public void afterTextChanged(Editable s) {} 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
       public void onTextChanged(CharSequence query, int start, int before, int count) { 
        genericRegionListAdapter.getFilter().filter(query.toString()); 
       } 
      }); 
     } 

     @Override 
     public void onClick(View view) { 
     } 

     @Override 
     public void onRecyclerItemClicked(int position, String itemName, String itemID) { 
    Log.v("Region Name", " : " + regionDetailArrayList.get(position).getRegionName()); 
     } 
    } 

アダプタクラス:

public class GenericRegionListAdapter extends RecyclerView.Adapter<GenericRegionListAdapter.DataObjectHolder> 
     implements Filterable { 

    private ArrayList<RegionDetail> originalArrayList; 
    private ArrayList<RegionDetail> filterArrayList; 
    private GenericRegionListAdapter.ValueFilter valueFilter; 
    private OnRecylerViewClickable onRecylerViewClickable; 
    private Context mContext = null; 

    @Override 
    public GenericRegionListAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sd_custom_cardview_for_walk_list_item, parent, false); 

     GenericRegionListAdapter.DataObjectHolder dataObjectHolder = new GenericRegionListAdapter.DataObjectHolder(view); 
     return dataObjectHolder; 
    } 

    @Override 
    public Filter getFilter() { 
     if (valueFilter == null) { 
      valueFilter = new GenericRegionListAdapter.ValueFilter(); 
     } 
     return valueFilter; 
    } 

    public class DataObjectHolder extends RecyclerView.ViewHolder{ 
     TextView textViewWalkName; 

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

      mContext = itemView.getContext(); 
      textViewWalkName = (TextView) itemView.findViewById(R.id.textView_Walk_Name); 
     } 

    } 

    public GenericRegionListAdapter(Context context, ArrayList<RegionDetail> detailsArrayList, 
            OnRecylerViewClickable onRecylerViewClickable, boolean doShowCheckbox) { 
     mContext = context; 
     this.originalArrayList = detailsArrayList; 
     this.filterArrayList = detailsArrayList; 
     this.onRecylerViewClickable = onRecylerViewClickable; 
    } 

    @Override 
    public void onBindViewHolder(final GenericRegionListAdapter.DataObjectHolder holder, final int position) { 
     holder.textViewWalkName.setText(originalArrayList.get(position).getRegionName()); 
     holder.textViewWalkName.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       onRecylerViewClickable.onRecyclerItemClicked(position, originalArrayList.get(position).getRegionName(), originalArrayList.get(position).getRegionID()); 
      } 
     }); 
    } 

    // method to access in activity after updating selection 
    public ArrayList<RegionDetail> getRegionList() { 
     return originalArrayList; 
    } 
    @Override 
    public int getItemCount() { 
     return originalArrayList.size(); 
    } 

    private class ValueFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       ArrayList<RegionDetail> filterList = new ArrayList<RegionDetail>(); 
       for (int i = 0; i < filterArrayList.size(); i++) { 
        if ((filterArrayList.get(i).getRegionName().toUpperCase()) 
          .contains(constraint.toString().toUpperCase())) { 
         RegionDetail listItem = new RegionDetail(); 
         listItem.setRegionID(filterArrayList.get(i).getRegionID()); 
         listItem.setRegionName(filterArrayList.get(i).getRegionName()); 
         filterList.add(listItem); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = filterArrayList.size(); 
       results.values = filterArrayList; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      originalArrayList = (ArrayList<RegionDetail>) results.values; 
      notifyDataSetChanged(); 
      Log.v("Size", " : " + originalArrayList.size()); 
      if (originalArrayList.size() == 0) { 
       new GlobalToast().showToastMessage(mContext, mContext.getResources().getString(R.string.no_records_found)); 
      } 
     } 
    } 
} 

私を助けてください。

+0

なぜあなたはそれが間違ったアイテムを選択していると思いますか? 'onRecyclerItemClicked'のLog.cからですか?もしそうなら、 'regionDetailArrayList'から' originalArrayList'の 'position'を使って表示しているようです。 'originalArrayList'はフィルターされ、' regionDetailArrayList'はフィルターされません。それは問題ですか? – Cheticamp

答えて

0

私はこのコードが正しくあなたのリストをフィルタリングし、あなたは右のリスト項目のonClickを願っています。このコードスニペットに

private class ItemFilter extends Filter { 
     String filterString; 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      filterString = constraint.toString().toLowerCase(); 

      FilterResults results = new FilterResults(); 

       int count = filterArrayList.size(); 
       ArrayList<RegionDetail> filterList = new ArrayList<RegionDetail>(); 
       String filterableString; 
       for (int i = 0; i < count; i++) { 

        RegionDetail listItem = new RegionDetail(); 
        listItem.setRegionID(filterArrayList.get(i).getRegionID()); 
        listItem.setRegionName(filterArrayList.get(i).getRegionName()); 
        filterList.add(listItem); 
       } 
       results.values =filterList; 
       results.count = filterList.size(); 

       return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

       originalArrayList = (ArrayList<RegionDetail>) results.values; 
       notifyDataSetChanged(); 

     } 
    } 

を使用してください。

関連する問題