java - 如何在 RecyclerView 的 ViewHolder 中正确实例化 mContentView,避免空对象引用?
问题描述
当我尝试为我的 ViewHolder 设置一个字符串作为 mContentView 的值时,Android 工作室说我正在创建一个空对象引用:
@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()));
}
});
}
解决方案
以我的适配器为例:
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 应该是适配器的内部类。
推荐阅读
- c# - 装配体以新的 csproj 格式探测私有路径
- python - 在 Python 中写入任何用户桌面
- javascript - Bootstrap 如何在不使用 @babel/plugin-transform-classes 的情况下使用 babel 转换 Javascript 中的类
- imageresizer - System.UnauthorizedAccessException:对路径“C:\inetpub\wwwroot\website\imagecache\0f\ae1ea.jpg.tmp_4a1f20d7.tmp”的访问被拒绝
- regex - Groovy 正则表达式匹配器或 - 唯一组或重复组 ID
- laravel - 我的听众没有将数据保存到表中
- mysql - 如何在 MySQL 中插入之前修复“触发错误”?
- syntax - 从简单文件加载符号
- python - 如何创建具有给定名称的空泡菜文件?
- javascript - Axios 有检测重定向的能力吗?