【发布时间】:2016-09-30 15:58:42
【问题描述】:
我需要我的列表视图始终有一个与其他列表项不同的尾随列表项,即使适配器为空。
我已经尝试在适配器构造函数的数据集末尾添加一个空项:
mDataset.add(null);
在 getView 方法中,我区分最后一项和其他项,并相应地膨胀不同的布局。
当用户添加新的列表项时,我需要删除数据集中的空项,将新数据添加到数据集的末尾,然后在数据集的最后一个索引中添加另一个空项:
public void addData(String data) {
mDataset.remove(mDataset.indexOf(null));
mDataset.add(data);
mDataset.add(null);
notifyDataSetChanged();
}
这当然是在适配器中调用的。当我运行该应用程序时,我收到以下错误:
java.lang.NullPointerException: Attempt to read from field 'android.widget.TextView com.neutronstar.revu.DataAdapter$DataViewHolder.mDataTextView' on a null object reference
在我的适配器的 getView() 方法中映射到这一行:
holder.mDataTextView.setText(mDataset.get(position));
这是适配器中的getView()方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
long viewType = getItemId(position);
Log.i("SPECS ADAPTER", viewType + "");
if (getCount() == 0)
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_add_spec, null);
else if (viewType == NOT_LAST_ITEM) {
SpecViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_spec, null);
holder = new SpecViewHolder(convertView);
convertView.setTag(holder);
} else
holder = (SpecViewHolder) convertView.getTag();
holder.mSpecTextView.setText(mSpecs.get(position));
} else {
if (convertView == null)
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_add_spec, null);
}
return convertView;
}
public void addSpec(String spec) {
mSpecs.remove(mSpecs.indexOf(null));
mSpecs.add(spec);
mSpecs.add(null);
notifyDataSetChanged();
}
static class SpecViewHolder {
@BindView(R.id.spec_text_view) TextView mSpecTextView;
SpecViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
如何解决这个错误?
谢谢
【问题讨论】:
-
基本上,你想添加一个页脚
-
我需要一个额外的列表项,所以它是列表的一部分,但它总是显示在列表视图的底部。 @Rotwang
-
显示你的 getView() 代码
-
用 getView() 方法更新了帖子。 @uguboz
-
我看不到你是怎么定义viewType的,所以我认为你的问题是这样的。例如列表中有 9 个项目,因此布局 A 有 9 个项目,然后布局 B 有第 10 个项目。添加项目后,列表会尝试更新第 10 个项目。此项目视图不为空,它是布局 B。但是您将其视为布局 A(因为现在这是 NOT_LAST_ITEM)。希望有所帮助!