当我尝试为我的ViewHolder设置一个字符串作为mContentView的值时,Android studio提示我正在创建一个空的对象引用:
@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,这样才能避免空对象引用?
下面是ViewHolder类:
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()));
}
});
}
发布于 2019-03-12 08:08:51
以我的适配器为例:
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应该是适配器的内部类。
https://stackoverflow.com/questions/55111044
复制相似问题