2

I want to test RecyclerView's setOnClickListener , but it don't take effect , what's the problem ?

The Fragment :

public class CrimeListFragment extends Fragment {
private RecyclerView mRecyclerView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_crime_list, container, false);
    mRecyclerView = (RecyclerView) view.findViewById(R.id.crime_list_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.setAdapter(new CrimeAdapter(CrimeLab.get(getActivity()).getCrimes()));
    mRecyclerView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show();
            Log.d("CrimeListFragment", "test");
        }
    });
    return view;
}

private class CrimeViewHolder extends RecyclerView.ViewHolder {
    private TextView mTitleTextView;

    public CrimeViewHolder(View itemView) {
        super(itemView);
    }

}

private class CrimeAdapter extends RecyclerView.Adapter {
    private List<Crime> mCrimes;


    public CrimeAdapter(List<Crime> crimes) {
        this.mCrimes = crimes;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final LayoutInflater inflater = LayoutInflater.from(getActivity());
        final View view = inflater.inflate(R.layout.list_item_crime, parent, false);
        return new CrimeViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    }

    @Override
    public int getItemCount() {
        return mCrimes.size();
    }
}

}

The fragment layout xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

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

The inflate layout xml :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/list_item_crime_title"
        android:layout_alignParentLeft="true"
        android:textStyle="bold"
        android:padding="4dp"
        android:text="Title"/>

</RelativeLayout>
shaoyihe
  • 1,047
  • 1
  • 12
  • 28

3 Answers3

0

Test it by starting an activity not toast, i had the same issue yasterday id didnt take effect with toast but worked with real job

H4F
  • 131
  • 10
0

You can create your own class which implements RecyclerView.OnItemTouchListener to handle OnClickListner :

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;


public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
  private OnItemClickListener mListener;

  public interface OnItemClickListener {
    public void onItemClick(View view, int position);
  }

  GestureDetector mGestureDetector;

  public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
      @Override public boolean onSingleTapUp(MotionEvent e) {
        return true;
      }
    });
  }

  @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
      mListener.onItemClick(childView, view.getChildPosition(childView));
      return true;
    }
    return false;
  }

  @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }

  @Override
  public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
}

How to use:

    RecyclerView mRecyclerView = view.findViewById(R.id.crime_list_view);
    mRecyclerView.addOnItemTouchListener(
        new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
          @Override public void onItemClick(View view, int position) {
            // you can handle here
            Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show();
            Log.d("CrimeListFragment", "test");

          }
        })
    );
Akshay
  • 6,029
  • 7
  • 40
  • 59
  • I know what's your mean. Actually i was looking the book `Android Programming The Big Nerd Ranch Guide 2nd Edition` , it gave the click listen in `CrimeAdapter#onCreateViewHolder ` and it worked normal . But why the whole `RecyclerView` can't response the `View.OnClickListener ` as it is a `ViewGroup` ? – shaoyihe Dec 13 '15 at 07:29
0

RecyclerView does not respond to setOnClickListener,

I have updated your adapter which would use to get the click event in recyclerView

private class CrimeAdapter extends RecyclerView.Adapter<CrimeAdapter.ViewHolder> {
    private List<Crime> mCrimes;


    public CrimeAdapter(List<Crime> crimes) {
        this.mCrimes = crimes;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final LayoutInflater inflater = LayoutInflater.from(getActivity());
        final View view = inflater.inflate(R.layout.list_item_crime, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
 holder.place_TextView.setText("" + mCrimes.get(position).getTheStringValueYouWant());
    }

    @Override
    public int getItemCount() {
        return mCrimes.size();
    }

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView place_TextView;

    public ViewHolder(View itemView) {
        super(itemView);
        place_TextView = (TextView) itemView.findViewById(R.id.list_item_crime_title);
        place_TextView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show();
    }
}
}

OnClick event is not the same thing in RecyclerView which we use in ListView.

As custom listview are growing in it's size views and animation, Google has tried to make to more flexibility in your hand.

further things you can do to get the click event is mentioned in following post OnItemClickListener in RecyclerView

Community
  • 1
  • 1
Pankaj Nimgade
  • 4,529
  • 3
  • 20
  • 30