1

I am trying to implement a search view that displays result in a Recyclerview. For that I have used a BaseAdapter as adapter for recyclerview. Now I want that whenever the user clicks on a particular item in the recyclerview(or on a particular search query in layman terms), it should return me its position. I have tried using getAdapterPosition, setonItemClickListener and all other possible means but all of them doesnt seem to work. I have attached my code for reference. Any kind of help would be appreciable.

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);
            }


        }

    }
}
Jinesh Francis
  • 3,377
  • 3
  • 22
  • 37
Pratik Paul
  • 43
  • 1
  • 1
  • 12
  • 3
    Possible duplicate of [How do I get the position selected in a RecyclerView?](http://stackoverflow.com/questions/26682277/how-do-i-get-the-position-selected-in-a-recyclerview) – MurugananthamS Aug 29 '16 at 12:31
  • 2
    Does `BaseAdapter` even work with `RecyclerView` I thought only supported [RecyclerView.Adapter](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html). Where you'd get the current position via `getAdapterPosition()`. – Abbas Aug 29 '16 at 12:32
  • use viewHolder.getAdapterPosition() in OnClickListener. – Maddy Aug 29 '16 at 12:46

2 Answers2

0

Try This:

    int position = getAdapterPosition();
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
MurugananthamS
  • 2,395
  • 4
  • 20
  • 49
  • I have already mentioned that getAdapterPosition() does not work in my case(possibly because I have used BaseAdapter instead of RecyclerView.Adapter). – Pratik Paul Aug 30 '16 at 07:45
0

Set a click listener to your view in onBindViewHolder and inside it use mRecyclerView.getChildLayoutPosition((View)sender); (mRecyclerView is as RecyclerView that you define in the adapter and assign it in your public Adapter method like this: mRecyclerView = recyclerView;

amitairos
  • 2,907
  • 11
  • 50
  • 84