繁体   English   中英

如何在列表视图中添加额外的列表项?

[英]How to add an extra list item to list view?

即使适配器为空,我也需要listview始终具有与其他列表项不同的结尾列表项。

我尝试在适配器构造函数的数据集末尾添加一个空项目:

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);
    }
}

如何解决此错误?

谢谢

您可以在XML中有一个ImageView,指向该listview为空,使其可见性消失。 在适配器类中,检查数据集是否为空,将Imageview Visibility.visible更改为Listview的可见性,并将其更改为visible.gone。

简短示例示例

XML格式

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
<ListView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/listView"/>
<ImageView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/imageview"
    android:visibility="gone"/>
</LinearLayout>

适配器

public class Adapter extends SomeAdapter{

//{
//constructor...
//overriden methods
//whatever you want...
//}

//place where you check if your dasaet is empty

if(dataset.length=0){
 listview.setVisibility(View.GONE);
 imageView.setVisibility(View.VISIBLE);
}
}

正如@Rotwang所说。 停止添加空项目,并在活动/片段中将页脚视图附加到列表视图,如下所示。

View v = getLayoutInflater().inflate(R.layout.footer, null);
listView.addFooterView(v); //IMPORTANT: make sure you call this before setAdapter
listView.setAdapter(adapter);

并且不要忘记创建页脚布局。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM