【问题标题】:NullPointerException on adding footer item to Android ListView将页脚项添加到 Android ListView 时出现 NullPointerException
【发布时间】:2011-09-20 08:37:32
【问题描述】:

我正在尝试制作包含 0-2 个页眉和 0-1 个页脚的“动态”列表视图(基于所需的模式)。 如果我使用订单

getListView().addFooterView(footerView, null, true);
getListView().setAdapter(myAdapter);

我收到一个错误:

java.lang.NullPointerException
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:778)
at android.widget.ListView.addFooterView(ListView.java:364)
at com.my.fragments.QuestionListFragment.updateList(QuestionListFragment.java:63)

如果我将线路切换到

getListView().setAdapter(myAdapter);
getListView().addFooterView(footerView, null, true);

没有错误,但模式更改时不会出现页脚视图(它会出现在下一次模式更改时,因此我认为代码正在运行)。

运行时此时footerView不为空

我不知道这里有什么问题,但我确实需要页眉和页脚作为列表视图的一部分(我可以使用 ScrollView 和单独的框架来实现,但那不行)

更新:要补充一点:列表中显示的数据正在异步加载并存储在单独的静态 ArrayList 中。我在加载开始时使用 setAdapter(null) 并在完成时使用 setAdapter(myAdapter) 来修改 ListView。也许问题就在这里?

更新2 view_question_list_footer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:layout_marginTop="2dip" android:layout_marginBottom="2dip">
    <TextView android:textAppearance="?android:attr/textAppearanceSmall" android:layout_height="wrap_content"
        android:layout_width="wrap_content" android:textStyle="bold" android:text="Load More Questions" android:gravity="center"
        android:layout_gravity="center" android:lines="3" android:textColor="@android:color/white"></TextView>
</FrameLayout>

QuestionAdapter.java

public class QuestionAdapter extends BaseAdapter {

    public class BrowseSettings {
        public SortingMode  sortingMode     = SortingMode.SORT_BY_DATE;
        public boolean          isAnswered      = true;
        public int              categoryFilter  = -1;
        public String           textFilter      = null;
    }

    private LayoutInflater  inflater            = null;
    private BrowseSettings  settings            = new BrowseSettings();
    private LoaderListener  loaderListener  = null;

    public QuestionAdapter(Context context, LoaderListener listener) {
        inflater = LayoutInflater.from(context);
        loaderListener = listener;
    }

    private void loadData() {
        QAData.questions.clear();
        appendData();
    }

    public void appendData() {
        new QuestionLoaderThread(settings.isAnswered, settings.sortingMode, settings.categoryFilter, settings.textFilter,
                QAData.questions.getCount(), BaseRequest.DEFAULT_COUNT_VALUE, loaderListener).start();
    }

    public void applyCategoryFilter(int filter) {
        settings.categoryFilter = filter;
        loadData();
    }

    public void applyTextFilter(String filter) {
        settings.textFilter = filter;
        loadData();
    }

    @Override
    public int getCount() {
        return QAData.questions.getCount();
    }

    @Override
    public Object getItem(int position) {
        return QAData.questions.get(position);
    }

    @Override
    public long getItemId(int position) {
        return QAData.questions.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        QuestionViewHolder viewHolder = null;
        if(convertView == null) {
            convertView = inflater.inflate(R.layout.view_question, null);
            viewHolder = new QuestionViewHolder();
            viewHolder.content = (TextView) convertView.findViewById(R.id.QuestionContent);
            viewHolder.likes = (TextView) convertView.findViewById(R.id.QuestionLikeCounter);
            viewHolder.question = QAData.questions.get(position);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (QuestionViewHolder) convertView.getTag();
        }

        viewHolder.content.setText(Html.fromHtml(viewHolder.question.getFormattedQuestion()));
        viewHolder.likes.setText(String.valueOf(viewHolder.question.getLikesCount()));

        return convertView;
    }

    private class QuestionViewHolder {
        private TextView content;
        private TextView likes;
        private QAQuestion question;
    }
}

【问题讨论】:

  • 请包含view_question_list_footer.xml 的XML 和myAdapter 的代码..

标签: java android exception listview footer


【解决方案1】:

尝试改用getListView().addFooterView(footerView);

【讨论】:

  • 你是如何创建footerView的?如果使用 LayoutInflater,请务必将父级设置为 null:View footerView mInflater.inflate(R.layout.footerView, null);
  • footer = LayoutInflater.from(getActivity().getBaseContext()).inflate(R.layout.view_question_list_footer, null);
  • 为什么不尝试将您的适配器设置为空的(即没有条目的非空对象)而不是使用空值?
  • 该死的......我感觉自己像个菜鸟 :( 你让我很开心 - 空 ArrayAdapter 而不是 null 工作。非常感谢!
  • 那么您是否设法通过设置虚拟适配器而不是页眉/页脚视图和真实适配器来解决此问题?我有同样的问题,但我无法解决!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多