2016-08-29 20 views
1

結果をRecyclerviewに表示する検索ビューを実装しようとしています。そのために、私はBaseAdapterをrecyclerviewのアダプターとして使用しました。今私は、ユーザーがrecyclerviewの特定のアイテム(または特定の検索クエリの素人用語)をクリックするたびに、それは私の位置を返す必要があります。私はgetAdapterPosition、setonItemClickListenerと他のすべての手段を使用してみましたが、それらのすべてが機能していないようです。参考のために私のコードを添付しました。どんな種類の助けがあっても大丈夫でしょう。Recyclerview BaseAdapterでクリックしたアイテムの位置を取得

public class SearchAdapter extends BaseAdapter implements Filterable { 

    private ArrayList<String> data; 
    private String[] suggestions; 
    private Drawable suggestionIcon; 
    private LayoutInflater inflater; 
    private boolean ellipsize; 

    public SearchAdapter(Context context, String[] suggestions) { 
     inflater = LayoutInflater.from(context); 
     data = new ArrayList<>(); 
     this.suggestions = suggestions; 
    } 

    public SearchAdapter(Context context, String[] suggestions, Drawable suggestionIcon, boolean ellipsize) { 
     inflater = LayoutInflater.from(context); 
     data = new ArrayList<>(); 
     this.suggestions = suggestions; 
     this.suggestionIcon = suggestionIcon; 
     this.ellipsize = ellipsize; 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filterResults = new FilterResults(); 
       if (!TextUtils.isEmpty(constraint)) { 

        // Retrieve the autocomplete results. 
        List<String> searchData = new ArrayList<>(); 

        for (String string : suggestions) { 
         if (string.toLowerCase().contains(constraint.toString().toLowerCase())) { 
          searchData.add(string); 
         } 
        } 

        // Assign the data to the FilterResults 
        filterResults.values = searchData; 
        filterResults.count = searchData.size(); 
       } 
       return filterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       if (results.values != null) { 
        data = (ArrayList<String>) results.values; 
        notifyDataSetChanged(); 
       } 
      } 
     }; 
     return filter; 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return data.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     SuggestionsViewHolder viewHolder; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.suggest_item, parent, false); 
      viewHolder = new SuggestionsViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (SuggestionsViewHolder) convertView.getTag(); 
     } 

     String currentListData = (String) getItem(position); 

     viewHolder.textView.setText(currentListData); 
     if (ellipsize) { 
      viewHolder.textView.setSingleLine(); 
      viewHolder.textView.setEllipsize(TextUtils.TruncateAt.END); 
     } 

     return convertView; 
    } 

    private class SuggestionsViewHolder { 
     TextView textView; 
     ImageView imageView; 

     public SuggestionsViewHolder(View convertView) { 
      textView = (TextView) convertView.findViewById(R.id.suggestion_text); 
      if (suggestionIcon != null) { 
       imageView = (ImageView) convertView.findViewById(R.id.suggestion_icon); 
       imageView.setImageDrawable(suggestionIcon); 
      } 


     } 

    } 
} 
+3

[RecyclerViewで選択された位置を取得するにはどうすればいいですか?](http://stackoverflow.com/questions/26682277/how-do-i-get-the-position-selected-in -a-recyclerview) – YUVRAJ

+2

'BaseAdapter'は' RecyclerView'でも動作しますか?私は[RecyclerView.Adapter](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html)しかサポートしていないと思っていました。 'getAdapterPosition()'を使って現在の位置を取得します。 – Abbas

+0

OnClickListenerのviewHolder.getAdapterPosition()を使用します。 – Maddy

答えて

0

これを試してみてください。

int position = getAdapterPosition(); 
+0

私はすでにgetAdapterPosition()が私のケースでは動作しないと述べています(おそらく、RecyclerView.Adapterの代わりにBaseAdapterを使用したためです)。 –

0

onBindViewHolderであなたのビューにクリックリスナを設定し、その中mRecyclerView.getChildLayoutPosition((View)sender);を使う(mRecyclerViewあなたは、アダプタに定義し、同様にあなたのpublic Adapter方法でそれを割り当てることをRecyclerViewようですこれは:mRecyclerView = recyclerView;

関連する問題