我目前正在为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触发所有视图重绘时,我一直在试验我的适配器和列表很多,但我不知道为什么它有时会弄乱我的条目调用。 任何人都可以帮助我吗?
如果不覆盖getViewTypeCount
,则只能获得一个null convertView
,因此您将使用image_list_item.xml
或text_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
的返回值
当您事先知道位置的视图类型时,应使用ListView的ViewHolder模式。 如果在添加新位置时它们将动态更改(实质上是在调用notifyDataSetChanged()
的情况下),则回收存在问题。
对于使用不同类型的视图动态更改集合,最好使用RecyclerView