user4928488
user4928488

Reputation:

Android: RecyclerView onClick Listener is not getting

I have an array of 600 items. I list down all the array items in a RecyclerView and scrolling well.But when I try to access onClick listener it is not getting. I try to Implement View.OnClickListener and Override onClick.But its not working.

I want to Toast item in the list item when user click one of the row item in the view

Adapter code is

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>  {

public static class ViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {
    private String mItem;
    private TextView mTextView;

    public ViewHolder(View view) {
        super(view);
        view.setOnClickListener(this);
        mTextView = (TextView) view.findViewById(R.id.item_title);
    }

    public void setItem(String item) {
        mItem = item;
        mTextView.setText(item);
    }

    @Override
    public void onClick(View view) {
        Log.d("TAG", "onClick " + getPosition() + " " + mItem);
    }
}

private String[] mDataset;

public MyAdapter(String[] dataset) {
    mDataset = dataset;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.setItem(mDataset[position]);
}

@Override
public int getItemCount() {
    return mDataset.length;
}

}

Can any one please help me Thanks in advance :)

Upvotes: 3

Views: 4805

Answers (3)

waleedsarwar86
waleedsarwar86

Reputation: 2374

I have create a sample project using your code onClickListener working fine.Like when i click on item shows me the clicked item position in Log.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private MyAdapter mAdapter;
    private RecyclerView mRecyclerView;
    private String[] dataSet = {"Waleed", "Sarwar", "Yousuf"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAdapter = new MyAdapter(dataSet);
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.setAdapter(mAdapter);


    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" />
</LinearLayout>

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private String[] mDataset;

    public MyAdapter(String[] dataset) {
        mDataset = dataset;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.setItem(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder
            implements View.OnClickListener {
        private String mItem;
        private TextView mTextView;

        public ViewHolder(View view) {
            super(view);
            view.setOnClickListener(this);
            mTextView = (TextView) view.findViewById(R.id.item_title);
        }

        public void setItem(String item) {
            mItem = item;
            mTextView.setText(item);
        }

        @Override
        public void onClick(View view) {
            Log.d("TAG", "onClick " + getPosition() + " " + mItem);
        }
    }
}

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="56dp"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

if you are still facing the problem download the sample project from link below.

https://www.dropbox.com/s/xf3y8oxok0zlgxk/RecyclerViewOnClick.zip?dl=0

Upvotes: 1

Beena
Beena

Reputation: 2354

You can handle it by setting on click listener to your parent view. Recyclerview don't provide you default item click listner same as listview. So create object of your parent layout and set it click listner.

Your holder initialization.

class UserListHolder extends RecyclerView.ViewHolder {
         RelativeLayout layoutMain;

      UserListHolder(View itemView) {

         layoutMain = (RelativeLayout)itemView.findViewById(R.id.layoutSquadItem);
     }
}

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder,final int position) {
((UserListHolder)viewHolder).layoutMain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
               //handle click
            }
    });
}

You can also refer recycler view on click listner

Upvotes: 0

Vishal Patel
Vishal Patel

Reputation: 2970

pls see jcobs ans it may help you

RecyclerView recyclerView = findViewById(R.id.recycler);
recyclerView.addOnItemTouchListener(
    new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
      @Override public void onItemClick(View view, int position) {
        // do whatever
      }
    })
);

implement your code in onitemclick. happy coding :)

Upvotes: 0

Related Questions