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);
}
}
}
在你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
应用点击收听到您的itemView
与itemView.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);
});
}
}
实际上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
}
});
}
试试这个答案https://stackoverflow.com/questions/28296708/get-clicked-item-and-its-position-in-recyclerview – nKalai
https://stackoverflow.com/a/35970486/1563038 –