Recyclerview 项目仅在单击文本时被选中

Recyler view item gets selected only on clicking the text

我已经实现了带有项目适配器的 RecyclerView,每个项目都有一个包含图像视图和文本视图的抽屉项目布局。
问题是 onClick 函数仅在单击图像或大小不同的 "actual text" 而不是整行时被调用。
有没有办法让整行用 onClick 函数监听?如果您有任何想法,请告诉我。 提前致谢。
RecyclerView image

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
String[] titles;
TypedArray icons;
Context context;
RecyclerViewAdapter(String[] titles, TypedArray icons, Context context){

        this.titles = titles;
        this.icons = icons;
        this.context = context;
}

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

    TextView navTitle;
    ImageView navIcon;
    Context context;

    public ViewHolder(View drawerItem , int itemType , Context context){

        super(drawerItem);
        this.context = context;
        drawerItem.setOnClickListener(this);
        if(itemType==1){
            navTitle = (TextView) itemView.findViewById(R.id.tv_NavTitle);
            navIcon = (ImageView) itemView.findViewById(R.id.iv_NavIcon);
        }
    }

   /**
    *This defines onClick for every item with respect to its position.
    */

    @Override
    public void onClick(View v) {

        MainActivity mainActivity = (MainActivity)context;
        mainActivity.drawerLayout.closeDrawers();
        FragmentTransaction fragmentTransaction = mainActivity.getSupportFragmentManager().beginTransaction();

        //switch (getPosition()){
        switch (getAdapterPosition()){
            case 1:
                Fragment fragment = new CountryWise();
                fragmentTransaction.replace(R.id.containerView,fragment);
                fragmentTransaction.commit();
                break;
            case 2:
                Fragment f2 = new CompanyWise();
                fragmentTransaction.replace(R.id.containerView,f2);
                fragmentTransaction.commit();
                break;
            case 3:
                Fragment about = new About();
                fragmentTransaction.replace(R.id.containerView,about);
                fragmentTransaction.commit();
                break;
        }
    }
}

@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(viewType==1){
             View itemLayout =   layoutInflater.inflate(R.layout.drawer_item_layout,null);
             return new ViewHolder(itemLayout,viewType,context);
        }
        else if (viewType==0) {
            View itemHeader = layoutInflater.inflate(R.layout.header_layout,null);
            return new ViewHolder(itemHeader,viewType,context);
        }

    return null;
}

   /**
*This method is called by RecyclerView.Adapter to display the data at the specified position.�
*This method should update the contents of the itemView to reflect the item at the given position.
*So here , if position!=0 it implies its a row_item and we set the title and icon of the view.
*/

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

    if(position!=0){
        holder.navTitle.setText(titles[position - 1]);
        holder.navIcon.setImageResource(icons.getResourceId(position-1,-1));
    }
}

@Override
public int getItemViewType(int position) {
    if(position==0)return 0;
    else return 1;
}

}

drawer_item_layout.xml

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

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:id="@+id/iv_NavIcon"
    />

<TextView
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="30dp"
    android:id="@+id/tv_NavTitle"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#000000"
    android:textSize="18sp"
    android:textStyle="bold"
    />

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawerMainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:fitsSystemWindows="true"
        android:minHeight="?android:attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark" />

    <FrameLayout
        android:id="@+id/containerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </FrameLayout>
</LinearLayout>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#FFFFFF"
    android:paddingTop="40dp"
    android:scrollbars="vertical" />

</android.support.v4.widget.DrawerLayout>

如果您需要更多代码,请告诉我。

你可以试试这个 在您的情况下为 RecyclerView 的父布局设置一个 id 线性布局并将此布局绑定到视图持有者并将 onclick 设置为此布局它应该工作

在适配器的 onCreateViewHolder() 方法中,按如下方式更改 inflate() 调用。

if(viewType == 1) {
    View itemLayout = layoutInflater.inflate(R.layout.drawer_item_layout, parent, false);
    return new ViewHolder(itemLayout, viewType, context);
}
else if(viewType == 0) {
    View itemHeader = layoutInflater.inflate(R.layout.header_layout, parent, false);
    return new ViewHolder(itemHeader, viewType, context);
}

您的行与 RecyclerView 的宽度不匹配,因为您没有将 parent 传递给 Inflater,所以它换行了宽度。