0

我以前从事 PHP 和 js 的工作,最近我正在研究 android listview 但是,我在为 listview 创建自定义适配器时遇到了问题

public View getView(int arg0, View arg1, ViewGroup arg2) {
        // TODO
        if (arg1 == null) {
            arg1 = myInflater.inflate(R.layout.grid, arg2, false);
        }
        TextView name = (TextView) arg1.findViewById(R.id.text1);
        TextView desc = (TextView) arg1.findViewById(R.id.text2);
        ImageView image = (ImageView) arg1.findViewById(R.id.image1);
        if (arg0 < images.length) {
            image.setImageResource(images[arg0]);
        }
        name.setText(names[arg0]);
        desc.setText(description[arg0]);
        return arg1;
    }

问题是我有 3 个内容数组要传递给 listview 网格,对于前两个数组,有 10 个元素,最后一个只有 5 个。所以,最后一个超出了界限。我添加了一个条件来检查它是否超过 5 ,但是 args0 似乎没有根据行增加?

if (arg0 < images.length) {
                image.setImageResource(images[arg0]);
            }

前五行和其他一些行也设置了图像,这是为什么以及如何解决这个问题?谢谢

4

2 回答 2

1

一般来说

由于您想显示Data到您的列表中,请创建一个表示数据的对象。

就像您在上面的评论中提到的那样:

public class ListEntry {
  String name = "";
  String gender = "";//use enum here perhaps -.-
  String photoUrl = null; //or use byte[] photo or whatever you've stored in your array before
  // write getters/setters for your members
}

那么您可以使用一个数组ListEntry[](或 List<ListEntry>)来访问所有数据。这样你就可以绕过你的 indexOutOfBoundsException。

在线查找任何 listadapter 教程,例如 Vogella 的教程

为什么比前五个条目有图像?

用于列表视图的 Android 适配器实现了一种缓存机制,以将新列表项(例如行)的膨胀(性能/内存成本密集型)降至最低。因此,创建的行数(或更多)仅与列表显示的一样多。由于您仅设置图像(如果有),但从不从行中删除已设置的图像,因此您会导致某些行重播它们不应该的图像。这些行是从以前向外滚动的行中缓存的。

因此添加类似

if (listItem.photo != null) {
  image.setImageResource(images[arg0]);
} else {
  image.setVisibility(View.GONE);
}

作为列表视图及其缓存机制的参考,请参阅ListViews 上的 Romain Guy

编辑关于 Listadapter 的使用

getView(..)您在上面发布的内容在您的实现ListAdapter中,最好是您已经扩展了ArrayAdapter<T>. 如果是这样,您T现在应该声明ListEntry并且您有任何声明的代码行

MyArrayAdapter myAdapter = new MyArrayAdapter()或类似的东西。

现在你有一个 ListEntry 的数组或列表,比如List<ListEntry> myCollection = new ArrayList<ListEntry>()orListEntry[] listEntries = new ListEntry[10]并使用

myAdapter.addAll(listEntries);

要在您的列表中获取项目,您getView(..)可以使用:

ListEntry currentEntry = getItem(arg0);

并参考 currentEntry 的单个成员来设置它们;-)

于 2013-07-25T02:30:03.917 回答
0

关于什么

if (images[arg0] != null) image.setImageResource(images[arg0]);

?

于 2013-07-25T02:19:50.547 回答