0

我已经用一个项目适配器实现了 RecyclerView,每个项目都有一个包含 imageview 和 textview 的抽屉项目布局。
问题是只有在单击大小不同的图像或“实际文本”而不​​是整行时才调用 onClick 函数。
有没有办法用 onClick 函数让整行监听?如果您有任何想法,请告诉我。提前致谢。
回收站查看图片

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

}

抽屉项目布局.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>

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

4

2 回答 2

1

在适配器的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,所以它改为包裹宽度。

于 2016-01-26T06:42:23.527 回答
0

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

于 2016-01-24T19:58:45.080 回答