【问题标题】:android recyclerview item clicksandroid recyclerview 项目点击次数
【发布时间】:2016-12-28 20:59:48
【问题描述】:

我在我的 android 项目中创建了一个 recyclerView。我有 11 个项目。每个项目由一个 imageview 和两个 textviews 组成。当我单击任何项​​目时,它应该转到它们对应的活动。我该如何完成。以下是我的 recyclerView 适配器的代码。请帮助我。

RecyclerAdapter.java:

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Sabudaniel61 on 2015-10-15.
 */
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder>  {
    HotelData[] hoteldata;View view;
    RecyclerAdapter(HotelData[] hoteldata){
        this.hoteldata=hoteldata;
    }
    @Override
    public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerlayout,null);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerAdapter.ViewHolder viewHolder, int i) {
        viewHolder.imageView.setImageResource(hoteldata[i].getImageUrl());
        viewHolder.textView1.setText(hoteldata[i].getHotel());
        viewHolder.textView2.setText(hoteldata[i].getPlace());


    }

    @Override
    public int getItemCount() {
        return hoteldata.length;
    }
    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView textView1,textView2;ImageView imageView;
        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            textView1=(TextView) itemLayoutView.findViewById(R.id.textView1);
            textView2=(TextView) itemLayoutView.findViewById(R.id.textView2);
            imageView=(ImageView) itemLayoutView.findViewById(R.id.imageView1);


        }

    }
}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    在您的 RecyclerAdapter 中创建一个 onclicklistener。

     private final OnClickListener mOnClickListener = new MyOnClickListener();
    
    @Override
    public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int position) {
        View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerlayout,null);
        view.setOnClickListener(mOnClickListener);
        return new MyViewHolder(view);
    }
    

    onClick 方法:

    @Override
    public void onClick(final View view) {
        int itemPosition = mRecyclerView.getChildPosition(view);
        String item = mList.get(itemPosition);//if you want to pass the data 
       //Navigate to your desired activity.
    }
    

    这是最简单的方法。

    【讨论】:

      【解决方案2】:
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
              TextView textView1,textView2;ImageView imageView;
              public ViewHolder(View itemLayoutView) {
                  super(itemLayoutView);
                  textView1=(TextView) itemLayoutView.findViewById(R.id.textView1);
                  textView2=(TextView) itemLayoutView.findViewById(R.id.textView2);
                  imageView=(ImageView) itemLayoutView.findViewById(R.id.imageView1);
      
                  itemLayoutView.setOnClickListener(this);
      
              }
              @Override
              public void onClick(View v) {
      
      
                  Intent intent = new Intent(mContext, ContentDetails.class);
                  itemView.getContext().startActivity(intent);
              }
          }
      

      试试这个

      【讨论】:

      • 但是我有 11 个项目,每个项目由 2 个 textview 和 imageview 组成。单击时,每个项目都应该转到自己的类。我认为在上面的代码中,当单击任何项​​目时,它会转到 ContentDetails 类
      • 您是否为每个项目使用单独的类?
      • 我认为通过使用位置,您可以重定向每次点击特定的活动
      • mContext应该是什么。是“this”吗?
      • 你应该将上下文传递给适配器。
      【解决方案3】:

      你可以像这样填充recyclerview:

      首先,在您的布局中,为线性布局添加一个 id

      <LinearLayout
          android:orientation="horizontal"
          android:id="@+id/linearView" //add this line
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
      
          <ImageView
              android:layout_width="20dp"
              android:layout_height="20dp"
              android:id="@+id/imageView1"
              android:layout_gravity="top" />
      
          <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="New Text"
              android:id="@+id/textView1"
              android:textStyle="bold"
              android:textAppearance="?android:attr/textAppearanceMedium"
              android:layout_gravity="top"
              android:layout_marginLeft="10dp" />
      </LinearLayout>
      

      上面的布局将在 onCreateViewHolder 函数上从您的适配器调用。

      然后,调用您在 viewHolder 类上创建的线性布局:

      public class ViewHolder extends RecyclerView.ViewHolder{
          TextView textView;ImageView imageView;LinearLayout linearLayout;
          public ViewHolder(View itemLayoutView) {
              super(itemLayoutView);
              textView1=(TextView) itemLayoutView.findViewById(R.id.textView1);
              imageView=(ImageView) itemLayoutView.findViewById(R.id.imageView1);
              linearLayout=(LinearLayout) itemLayoutView.findViewById(R.id.linearView);
          }
      
      }
      

      最后,将 onclicklistener 设置为您的 recyclerview 项目,如下所示:

      @Override
      public void onBindViewHolder(ViewHolder holder, int position) {
          //i use arraylist of type Hotel instead of array
          final Hotel hotel = HotelData.get(position);
      
          holder.textView1.setText(hotel.getName());
          //if you want to add clicklistener to recyclerview item
          holder.linearLayout.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                   //you can call activity here
              }
          });
          //if you want to add click listener to textview inside recyclerview item
          holder.textView1.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                   Toast.makeText(MainActivity.class,"textview clicked",Toast.LENGTH_LONG).show();
              }
          });
      }
      

      【讨论】:

        【解决方案4】:

        在适配器内部放置一个接口并从活动中调用它:

        private ArrayList<Inbox> list;
        private Activity context;
        private onItemClickedListener onItemClickedListener;
        
        public InboxListAdapter(Activity context, ArrayList<Inbox> list) {
            this.list = list;
            this.context = context;
        }
        
        public class ViewHolder extends RecyclerView.ViewHolder {
        
            private ImageView image;
            private TextView name;
            private TextView date;
            private ImageButton btn_play;
            private ImageButton btn_share;
        
            public ViewHolder(View itemLayoutView) {
                super(itemLayoutView);
                image = (ImageView) itemLayoutView.findViewById(R.id.image);
                name = (TextView) itemLayoutView.findViewById(R.id.name);
                date = (TextView) itemLayoutView.findViewById(R.id.date);
            }
        }
        
        @Override
        public InboxListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                              int viewType) {
        
            View itemLayoutView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_inbox_list, parent, false);
        
            ViewHolder viewHolder = new ViewHolder(itemLayoutView);
            return viewHolder;
        }
        

        来自活动

        InboxListAdapter adapter = new InboxListAdapter(getActivity(), list);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(adapter);
        adapter.setOnItemClickedListener(new InboxListAdapter.onItemClickedListener() {
                    @Override
                    public void onItemClicked(Inbox inbox) {
        
                     }
                });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多