首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ViewHolder中正确实例化mContentView,以避免空对象引用?

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

Stack Overflow用户
提问于 2019-03-12 05:59:50
回答 1查看 121关注 0票数 1

当我尝试为我的ViewHolder设置一个字符串作为mContentView的值时,Android studio提示我正在创建一个空的对象引用:

代码语言:javascript
复制
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.mItem = mValues.get(position);
    holder.mContentView.setText(mValues.get(position).getName());

}

错误消息:

代码语言:javascript
复制
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,这样才能避免空对象引用?

下面是ViewHolder类:

代码语言:javascript
复制
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()));
            }
        });
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-12 08:08:51

以我的适配器为例:

代码语言:javascript
复制
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");
    }
}

}

注意:您的ViewHOlder应该是适配器的内部类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55111044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档