0

私は上にedittextを持っています&以下はrecyclerviewのリストです。私は最初にedittextを使用してリスト&をフィルタリングし、次にリストから特定の項目を選択する際には、単にアプリケーション上のプリント/トーストを選択します。recyclerviewリストの間違った項目を取得するフィルタリングと選択

私の問題は、私はリストから特定のアイテムを選択するとリストをフィルタリングすることができますが、間違ったアイテム名はフィルタリングの代わりに元のリストから取得することを意味します。

以下は、私が問題はここintent.putExtra("Name", nameList.get(position).getName());あなたは、元のリストのアイテムを取得すると思いフラグメント

onCreateView() { 
     recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, 
       new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         // TODO Handle item click 
         // Send the event to the host activity 
         Intent intent = new Intent(); 
         intent.putExtra("Name", nameList.get(position).getName()); 
         getTargetFragment().onActivityResult(
           getTargetRequestCode(), 101, intent); 
         dismiss(); 
        } 
       }) 
     ); 

    addTextListener(); 

} 

public void addTextListener(){ 

    editTextSearch.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) { 
      adapter.getFilter().filter(query.toString().toLowerCase()); 
     } 
    }); 
} 

マイアダプタクラスコード

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

    private ArrayList<NameDetail> originalNameDetailArrayList; 
    private List<NameDetail> filterNameDetailList; 
    private Context mContext = null; 
    private ValueFilter valueFilter; 

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

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

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

    public class DataObjectHolder extends RecyclerView.ViewHolder { 

     TextView textViewName; 
     ImageView image; 

     public DataObjectHolder(View itemView) { 
      super(itemView); 
      mContext = itemView.getContext(); 
      textViewName = (TextView)itemView.findViewById(R.id.textView_Name); 
     } 

    } 


    public NameListAdapter(Context context, ArrayList<NameDetail> originalNameDetailArrayList) { 
     this.mContext = context; 
     this.originalNameDetailArrayList = originalNameDetailArrayList; 
     this.filterNameDetailList = originalNameDetailArrayList; 
    } 

    @Override 
    public void onBindViewHolder(final NameListAdapter.DataObjectHolder holder, int position) { 
     holder.textViewName.setText(originalNameDetailArrayList.get(position).getName()); 
    } 
    @Override 
    public int getItemCount() { 
     return originalNameDetailArrayList.size(); 
    } 

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

      if (constraint != null && constraint.length() > 0) { 
       ArrayList<NameDetail> filterList = new ArrayList<NameDetail>(); 
       for (int i = 0; i < filterNameDetailList.size(); i++) { 
        if ((filterNameDetailList.get(i).getName().toUpperCase()) 
          .contains(constraint.toString().toUpperCase())) { 
         NameDetail listItem = new RegionDetail(); 
         listItem.setID(filterNameDetailList.get(i).getID()); 
         listItem.setName(filterNameDetailList.get(i).getName()); 
         filterList.add(listItem); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = filterNameDetailList.size(); 
       results.values = filterNameDetailList; 
      } 
      return results; 

     } 

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

} 
+0

[この回答](http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif)を参照してください。 –

+0

@SelçukCihan方法を変更する代わりに、フィルタリングされたアイテムを取得する別の方法が必要です。 – VVB

+0

これに代わる方法として、 'onCreateViewHolder'の中で個々の行にリスナーを設定することができます。 –

答えて

0

内部の私の部分のコードです。しかし、アダプターの内側にあるフィルタリングされたリストの項目が必要です。

私はあなたのアダプタ内onclicklistenerを使用してrecommentたい:

holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // your implementation 
    } 
}); 

またはあなたのアダプタgetFilteredItem(position)で関数を作成します。

編集

もう一つのアイデアは、あなたのフラグメントでコールバックを作成し、アダプタを介してそれを渡しています。お使いのアダプタ内部のonclickにこのコールバックを呼び出します。

holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     callback.onItemClicked(item); 
    } 
}); 

次に、あなたがあなたのフラグメント内で呼び出すことができます。

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

あなたは上のフィルタリングされています

public void onItemClicked(MyItem item) { 
    // your implementation 
    item.getName(); // do whatever you want with the name 
} 
+0

他のフラグメント作業がオーバーロードされるため、この作業を行うことはできません。 – VVB

+0

他のフラグメント作業のコードを表示できますか? – beeb

+0

別のアイデアで私の答えを更新しました。 – beeb

-1

私はこの問題はここだと思いますonTextChangedですが、新しいフィルタを作成する代わりに古いフィルタを再利用しています。すべてのgetFilterリクエストで、次のような新しいフィルタを作成する必要があります。

@Override 
public Filter getFilter() { 
    return new ValueFilter() 
} 

これはうまくいきます。

+0

私の問題はフィルターではありません。代わりにフィルタリングされた位置 – VVB

0

私はこれが遅いと知っていますが、私は同じ問題を抱えていました。私は私のことを解決して以来、私はあなたのお手伝いをしました。

簡単に修正できます。リサイクラー・ビュー・アダプター内に、以下のようにモデルを戻すメソッドを作成します。

ここ
public Model getItem (int position) { 
    return modelList.get(position) 
} 

modelListListまたはModelArrayListです。

、私はこのことができます願っていrecyclerAdapter.getItem(position)

としてあなたフィルタリングされたリストに、このメソッドを呼び出します。スタックオーバーフローに答えるのはこれが初めてのことです。

関連する問題