【问题标题】:How to add an extra list item to list view?如何在列表视图中添加额外的列表项?
【发布时间】: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)。希望有所帮助!

标签: android listview


【解决方案1】:

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

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

别忘了创建页脚布局。

【讨论】:

    【解决方案2】:

    你可以在你的 XML 中有一个 ImageView 指向 listview 是空的,并使其 visibility.gone。在您的适配器类中检查您的数据集是否为空,使 Imageview Visibility.visible 和 Listview 的可见性更改为 visibility.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);
    }
    }
    

    【讨论】:

    • 我认为你没有理解这个问题。对于列表的最后一项,我有一个单独的 xml 布局。我需要知道为什么会发生这个错误。
    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2020-04-30
    • 2012-03-25
    相关资源
    最近更新 更多