OnItemClickListener RecyclerView

问题描述:

我想添加项目点击侦听器到我的RecyclerView,这样当我点击某个项目时,它会启动一个新的Intent并从Web服务器中检索有关该项目的数据。我已经尝试了很多建议,但没有帮助。OnItemClickListener RecyclerView

public class GetPrice extends AppCompatActivity { 
private RecyclerView recyclerView; 
private GridLayoutManager gridLayoutManager; 
private CustomAdapter adapter; 
private List<MyData> dataList; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.getpricerecycle); 
    recyclerView =(RecyclerView) findViewById(R.id.recycler_view); 

    dataList = new ArrayList<>(); 
    load_data_from_server(0); 
    gridLayoutManager = new GridLayoutManager(this,1); 
    recyclerView.setLayoutManager(gridLayoutManager); 
    adapter = new CustomAdapter(this,dataList); 
    recyclerView.setAdapter(adapter); 

} 

private void load_data_from_server(final int id) { 
    AsyncTask<Integer,Void,Void> task = new AsyncTask<Integer, Void, Void>() { 
     @Override 
     protected Void doInBackground(Integer... params) { 
      OkHttpClient client = new OkHttpClient(); 
      Request request = new Request.Builder().url("http://172.20.10.7/anfal/getPrice.php?id="+id).build(); 
      try { 
       Response response = client.newCall(request).execute(); 
       JSONArray array = new JSONArray(response.body().string()); 
       for(int i=0;i<array.length();i++){ 
        JSONObject jsonobject = array.getJSONObject(i); 
        MyData data=new MyData(jsonobject.getInt("id"),jsonobject.getString("name"),jsonobject.getString("price"),jsonobject.getString("image")); 
        dataList.add(data); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       System.out.println("End Of Content"); 
      } 


      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
task.execute(id); 

} 

我RecylerView类,这里是我的看法回收适配器coustm

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {                 
     private Context context; 
     private List<MyData> my_data; 
     public CustomAdapter(Context context, List<MyData> my_data) { 
     this.context = context; 
     this.my_data = my_data; 
    } 

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

    } 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
      holder.name.setText(my_data.get(position).getName()); 
      holder.price.setText(my_data.get(position).getPrice()); 


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

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView name; 
     public TextView price; 
     public ImageView imageview; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      name=(TextView)itemView.findViewById(R.id.description); 
      price=(TextView) itemView.findViewById(R.id.nameofp); 
      imageview=(ImageView) itemView.findViewById(R.id.imgevie); 
     } 
    } 

} 
+0

试试这个答案https://stackoverflow.com/questions/28296708/get-clicked-item-and-its-position-in-recyclerview – nKalai

+0

https://stackoverflow.com/a/35970486/1563038 –

在你RecyclerView.Adapter简单地创建您可以使用的接口。

private onItemClickListener mItemClickListener; 

public void setOnItemClickListener(onItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
} 

public interface onItemClickListener { 
    void onItemClickListener(View view, int position, MyData myData); 
} 

在这种情况下mItemClickListener是您的适配器中的全局变量和两个方法去适配器里面了。

然后你ViewHolder应用点击收听到您的itemViewitemView.setOnClickListener(this)(或任何你想要的组件点击检索数据)

@Override 
public void onClick(View view) { 
    if (mItemClickListener != null) { 
     mItemClickListener.onItemClickListener(view, getAdapterPosition(), my_data.get(getAdapterPosition())); 
    } 
} 

这一操作将通过已单击视图,位置所述视图和包含在该位置内的列表中的对象。

因此,在您的Activity中,您只需拨打interface即可。

adapter.setOnItemClickListener(new CustomAdapter.onItemItemClickListener() { 
    @Override 
    public void onItemClickListener(View view, int position, MyData data) { 
    //do on item click functionality here 
    } 
}); 

第一种方式

recyclerViewObject.addOnItemTouchListener(
     new RecyclerItemClickListener(
      getContext(), 
      recyclerViewObject, 
      new RecyclerItemClickListener.OnItemClickListener() { 
       @Override public void onItemClick(View view, int position) { 
        // view is the clicked view (the one you wanted 
        // position is its position in the adapter 
       } 
       @Override public void onLongItemClick(View view, int position) { 
       } 
      } 
     ) 
    ); 

方式二

public interface PositionClickListener { 
    void itemClicked(int position); } 

适配器

public class MyRecyclerAdapter extends RecyclerView.Adapter 
{ 
    public final PositionClickListener listener; 

    public MyRecyclerAdapter(PositionClickListener listener) 
    { 
     this.listener = listener; 
    } 

    private void createView(int position) 
    { 
     View v = new View(); 
     v.setOnClickListener(new OnClickListener(){ 
      listener.itemClicked(position); 
     }); 
    } 
} 

Reference

实际上recyclerView和OnClickListener最好的做法是做到这一点的方法:

在你的活动:

//Add this line in the onCreate method 
//Add more parameters if needed for your adapter 
DataAdapter myDataAdapter = new DataAdapter (context, myClickListener); 


private View.OnClickListener myClickListener = new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View view) 
    { 
     int position = view.getTag() 
     //Do something... 
    } 
}; 

而在你的适配器

private View.OnClickListener myClickListener; 
private Context context; 

public DataAdapter (Context context, View.OnClickListener myClickListener) 
{ 
    this.context = context; 
    this.myClickListener = myClickListener; 
} 

public class ViewHolder extends RecyclerView.ViewHolder 
{ 

    //Your attributes 

    public myViewHolder(View v, View.OnClickListener myClickListener) 
    { 
     super(v); 
     v.setOnClickListener(myClickListener); 
    } 
} 

@Override 
public void onBindViewHolder(myViewHolder holder, int position) 
{ 
    holder.itemView.setTag(position) 
} 

当然它适用于任何类型的clickListener。

希望这个帮助!

你可以改变ViewHolder

  public ViewHolder(View itemView) { 
      super(itemView); 

      name=(TextView)itemView.findViewById(R.id.description); 
      price=(TextView) itemView.findViewById(R.id.nameofp); 
      imageview=(ImageView) itemView.findViewById(R.id.imgevie); 



      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

       // Here is the action 


       } 
      }); 


     } 

添加点击事件里面CustomAdapter.ViewHolder

ItemView控件即ItemView控件。setOnClickListener()和内部的onClick()方法来获取点击的项目的位置是这样的:

getAdapterPosition()

实施recyclerview项目点击最简单的方法是在适配器的onBindViewHolder方法来实现。

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) { 
     vh.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //use position value to get clicked data from list 
      } 
     }); 
    }