自定义ArrayAdapter使用NullPointerException搞乱视图

问题描述 投票:3回答:2

我目前正在为Android开发内容创建应用程序。 它的主要目的是让用户从文本和图像条目中生成一个列表(最后用EditText和ImageView表示)。

我使用ViewHolder模式编写自定义ArrayAdapter,将此列表连接到ListView

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // get current Entry
    Entry e = getItem(position);
    // variable for holding the view
    ViewHolder holder;

    // check if there is no view created
    if (convertView == null) {
        // prepare holder for view to be saved in
        holder = new ViewHolder();

        // get layout inflater
        LayoutInflater inflater = (LayoutInflater) super.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // if current entry is an image entry
        if (e.getType().equals(Entry.Type.IMAGE_ENTRY)) {
            // inflate layout with ImageView
            convertView = inflater.inflate(R.layout.image_list_item,
                    parent, false);
            ImageView iView = (ImageView) convertView
                    .findViewById(R.id.imageDisplay);

            // save inflated view in holder
            holder.imageViewItem = iView;

            // store the holder with the view
            convertView.setTag(holder);

            // if it is a text entry
        } else if (e.getType().equals(Entry.Type.TEXT_ENTRY)) {
            // inflate layout with EditText
            convertView = inflater.inflate(R.layout.text_list_item, parent,
                    false);
            EditText tView = (EditText) convertView
                    .findViewById(R.id.textField);

            // save inflated view in holder
            holder.editTextItem = tView;

            // store the holder with the view
            convertView.setTag(holder);

        }
    } else {
        // get holder from existing view
        holder = (ViewHolder) convertView.getTag();
    }
    if (e != null) {
        if (e.getType().equals(Entry.Type.IMAGE_ENTRY)) {
            // load corresponding image
            holder.imageViewItem.setImageBitmap(((ImageEntry) e).getImage());
        } else if (e.getType().equals(Entry.Type.TEXT_ENTRY)) {
            // load corresponding text
            holder.editTextItem.setText(((TextEntry) e).getText());
        }
    }
    return convertView;
}

与我看到的教程和示例相反,我需要区分由于文本和图像条目之间的差异而导致的布局。 这似乎造成了一些麻烦,因为有时在添加不同的条目后,我得到了这些例外

E/AndroidRuntime(15812): java.lang.NullPointerException: Attempt to     invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference 
E/AndroidRuntime(15812):    at <project>.util.EntryListAdapter.getView(EntryListAdapter.java:104)

所以,在我看来,该方法被调用错误的视图,因为否则必须有一个“EditText”类型的对象。 我不太确定当ListView触发所有视图重绘时,我一直在试验我的适配器和列表很多,但我不知道为什么它有时会弄乱我的条目调用。 任何人都可以帮助我吗?

android arrays listview adapter
2个回答
2
投票

如果不覆盖getViewTypeCount ,则只能获得一个null convertView ,因此您将使用image_list_item.xmltext_list_item.xml对其进行初始化。 如果要处理不同类型的视图覆盖

 public int getViewTypeCount() {
       return 2;
 }

处理两种不同类型的视图和getItemViewType

public int getItemViewType (int position) {
    Entry e = getItem(position);
    if (e.getType().equals(Entry.Type.IMAGE_ENTRY)) {
        return 0;
    }
    return 1;
}

并在getView检查getItemViewType的返回值


1
投票

当您事先知道位置的视图类型时,应使用ListView的ViewHolder模式。 如果在添加新位置时它们将动态更改(实质上是在调用notifyDataSetChanged()的情况下),则回收存在问题。

对于使用不同类型的视图动态更改集合,最好使用RecyclerView

© www.soinside.com 2019 - 2024. All rights reserved.