如何在RecyclerView的ViewHolder中正确实例化mContentView,以避免空对象引用?



当我尝试将字符串设置为McOntentView为我的视图持有人的值时,Android Studio说我正在创建一个null对象参考:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.mItem = mValues.get(position);
    holder.mContentView.setText(mValues.get(position).getName());
}

错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gatech.astroworld.spacetrader, PID: 10155
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.gatech.astroworld.spacetrader.views.market.Buy_Item_RecyclerAdapter.onBindViewHolder(Buy_Item_RecyclerAdapter.java:49)

基本上,我的问题是:我如何实例化mcontentview,因此我可以避免零对象引用?

这是视图持有人类:

public class ViewHolder extends RecyclerView.ViewHolder {
    public View mView;
    public TextView mIdView;
    public TextView mContentView;
    public Store.MarketGood mItem;
    public int textCount = 0;
    public ViewHolder(View view) {
        super(view);
        mView = view;
        mIdView = view.findViewById(R.id.item_number);
        mContentView = view.findViewById(R.id.content);
        final TextView itemCountText = view.findViewById(R.id.countText);
        final TextView showName = view.findViewById(R.id.itemName);
        Button plusButton = mView.findViewById(R.id.plusButton);
        Button minusButton = mView.findViewById(R.id.minusButton);

        plusButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //showName.setText(mItem.getName());
                store.incrementCountBuy(mItem);
                itemCountText.setText(String.valueOf(mItem.getCount()));
            }
        });
        minusButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                store.decrementCountBuy(mItem);
                itemCountText.setText(String.valueOf(mItem.getCount()));
            }
        });
    }

请参见我的适配器作为示例:

public class AdapterAssetList extends RecyclerView.Adapter<AdapterAssetList.ViewHolderAssets> {
private final LayoutInflater layoutInflater;
OnItemClickListener itemClickListener;
Context context;
private ImageLoader imageLoader;
public AdapterAssetList(Context mContext, ArrayList<Asset> assetList) {
    this.context = mContext;
    this.assetList = assetList;
    layoutInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public ViewHolderAssets onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = layoutInflater.inflate(R.layout.dashboard_asset_childs, viewGroup, false);
    ViewHolderAssets viewHolderAssets = new ViewHolderAssets(view);
    return viewHolderAssets;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolderAssets holder, int position) {
    imageLoader = VolleySingleton.getInstance(context).getImageLoader();
    holder.assetName.setText(assetList.get(position).getName());
    holder.assetValue.setText(withSuffix((long) assetList.get(position).getValue()));
}
@Override
public int getItemCount() {
    if (assetList == null)
        assetList = new ArrayList<>();
    return assetList.size();
}
public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
    this.itemClickListener = mItemClickListener;
}
public void removeAt(int position) {
    //subsPlanList.remove(position);
    notifyItemRemoved(position);
    //notifyItemRangeChanged(position, subsPlanList.size());
}
public interface OnItemClickListener {
    public void onItemClick(View view, int position, String id);
}
public class ViewHolderAssets extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView assetName;
    TextView assetValue;

    public ViewHolderAssets(@NonNull View itemView) {
        super(itemView);
        assetName = itemView.findViewById(R.id.txt_asset_name);
        assetValue = itemView.findViewById(R.id.txt_asset_value);

    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    @Override
    public void onClick(View v) {
        itemClickListener.onItemClick(v, getAdapterPosition(), "copyright");
    }
}
}

注意:您的视图持有人应该是适配器的内部类别。

您可以为您的视图持有人创建一个内部类,并扩展RecyClerview.ViewHolder。然后,在您的新Viewholder类中添加类似于 binddata 的方法,并添加用户实现。完成此操作后,从OnBindViewHolder方法调用BindData。

eg:https://github.com/kartikkumargujarati/android-rr/blob/blob/blob/blob/bbbaa0064777377777777777614f4291760ff4291760fff324ff324df324df324dfb//p>

最新更新