我是 RecyclerView 的新手。我们可以获取RecyclerView中被点击的item位置,但是我们可以设置和获取RecyclerView的item ID吗?因为在我的 RecyclerView 中,该项目具有服务器提供的自定义 ID。我试过这段代码:
FragmentListProduct.java
productData = new JSONArray();
linearLayoutManager = new LinearLayoutManager(fragmentActivity);
lpAdapter = new ListProductAdapter(fragmentActivity, R.layout.list_product_grid, productData, null,
new ListProductHolder.OnProductClickListener() {
@Override
public void onProductClick(View v, long id) {
Toast.makeText(fragmentActivity, "id:"+id, Toast.LENGTH_SHORT).show();
MainActivity.setIdToRead((int) id);
MainActivity.replaceFragment(FragmentListProduct.this, new FragmentViewProduct());
}
});
rvProductList = (RecyclerView) mainView.findViewById(R.id.rvProductList);
rvProductList.setLayoutManager(linearLayoutManager);
rvProductList.setAdapter(lpAdapter);
rvProductList.setHasFixedSize(true);
ListProductHolder.java
public class ListProductHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvTitle;
TextView tvPrice;
ImageView ivImage;
private OnProductClickListener onProductClickListener;
ListProductHolder(View itemView, OnProductClickListener onProductClickListener) {
super(itemView);
this.onProductClickListener = onProductClickListener;
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
ivImage = (ImageView) itemView.findViewById(R.id.ivImage);
tvPrice = (TextView) itemView.findViewById(R.id.tvPrice);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
onProductClickListener.onProductClick(view, getItemId());
}
public static interface OnProductClickListener {
public void onProductClick(View v, long id);
}
}
ListProdutAdapter.java
public class ListProductAdapter extends RecyclerView.Adapter<ListProductHolder> {
private Activity activity;
private int layoutResource;
private JSONArray productDataArray;
private StringSignature downloadSignature;
private ListProductHolder.OnProductClickListener onProductClickListener;
public ListProductAdapter(Activity activity, int layoutResource, JSONArray productDataArray, StringSignature downloadSignature, ListProductHolder.OnProductClickListener onProductClickListener) {
this.activity = activity;
this.layoutResource = layoutResource;
this.productDataArray = productDataArray;
this.downloadSignature = downloadSignature;
this.onProductClickListener = onProductClickListener;
}
@Override
public ListProductHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(activity).inflate(layoutResource, parent, false);
return new ListProductHolder(v, onProductClickListener);
}
@Override
public void onBindViewHolder(ListProductHolder holder, int position) {...}
@Override
public long getItemId(int i) {
long itemId = -1;
try {
itemId = productDataArray.getJSONObject(i).getInt("id");
} catch (JSONException e) {
e.printStackTrace();
}
return itemId;
}
}
但当我尝试时,ID 始终为 -1。如何解决这个问题?还是我可以做其他解决方案?
最佳答案
在绑定(bind) View 持有者中添加点击监听器,因为 View 将被重用,您必须为每个重用 View 设置点击。将点击监听器添加到根布局
@Override
public void onBindViewHolder(ListProductHolder holder, int position) {
final long itemId = productDataArray.getJSONObject(position).getInt("id");
holder.rootLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onProductClickListener.onProductClick(view, itemId);
}
});
}
关于android - 设置和获取回收站 View 的项目 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40989863/