android - 设置和获取回收站 View 的项目 ID

标签 android android-recyclerview

我是 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/

相关文章:

Android 编辑文本 : How to process data

android - 垂直 ScrollView 内的水平 RecyclerView

android - Fragment 在点击时隐藏和显示

android - 为什么 Android 服务会被 Android 操作系统停止?

android - 带传递解析对象的 popBackStack

android - 如何从WebView获取一些信息

android - 单击时将 RecyclerView 项目转换为 CardView

Android - 如何在滚动时停止在 Recyclerview 中重新加载图像

android - 没有连接适配器;跳过 Material 对话框内回收器 View 的布局

android - 在文本转语音停止在 Android 上说话后运行代码