0

我确实在每一行都有一个包含图像视图的列表。在某些行中,我想显示这些图像,而在某些行中,我不想显示它们,因此我使用了自定义 ListAdapter:

列表行 XML 具有:

<ImageView
 android:id="@+id/image1"
 android:layout_height="fill_parent"
 android:src="@drawable/button1"
 android:visibility="invisible"/>

因此,您可以看到默认情况下所有图像都是不可见的。

然后在自定义 SimpleAdapter 中检查我的条件,并根据我将这一行的图像设置为可见:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);

if(condition == true){

   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
}

return view;

}

所以我正在这样做,每行有 2 个 ImageViews 和 3 个 TextViews。ImageViews 默认情况下是不可见的,并且根据如上所示的条件变得可见。TextVoews 是黑色的,并根据另一个条件获得另一种文本颜色。

我的问题是,这对于像 1-5 项左右这样的小列表很有效,但是当列表变长时,这不会按预期工作。结果有时只是错误的,当我根据相同的数据重新加载列表视图时,我可能每次都会看到不同的结果。图像设置错误或文本颜色设置错误。

第二个问题是,当我对适配器应用过滤器时,这完全而且肯定是错误的。我确实有一个 EditText 字段,我想在这个 EditText 的每次更改上应用过滤器,所以我在那个 EditText 上有一个 TextChangedListener:

edittext1.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void afterTextChanged(Editable s) {

            adapter.getFilter().filter(s);
        }
    });

从我将焦点设置到此 EditText 的那一刻起,整个列表视图就完全改变了,现在基于条件的格式似乎不仅“有时是错误的”,而且现在“完全没有任何逻辑”。

那么这是我创建行和使用适配器的正确方法吗?为什么这不能正常工作,为什么当我开始使用过滤器时它会变得完全疯狂?

非常感谢您的帮助。

4

3 回答 3

1

适配器视图被回收,因此您必须考虑所有路径,例如:

if(condition == true){

   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
} else {
   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.INVISIBLE);
}

这样,ImageView当条件为假时,将被隐藏。

不知道您的过滤器问题,我的直觉是它与上述相同的问题有关。

于 2011-08-19T20:38:29.027 回答
0

所以我最终将 SimpleAdapter 更改为 ArrayAdapter 并且没有使用默认的过滤器方法,而是实现了一种过滤 ArrayList 并将过滤后的 ArrayList 设置为适配器列表的方法。现在它起作用了。使用 SimpleAdapter 过滤后图像尚未更新,使用过滤列表我无法更新视图。现在工作。

于 2011-08-20T09:45:34.993 回答
0

对于第一个问题:

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

    if(convertView == null) {
        convertView = mInflater.inflate(R.layout.my_list_row, null);

        if(condition == true)
            ((ImageView) convertView.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
        else
            ((ImageView) convertView.findViewById(R.id.image1)).setVisibility(View.INVISIBLE);
    }

    return convertView; 
}

至于过滤器,你想做什么?您可能想查看 inputTypes:

http://developer.android.com/reference/android/widget/TextView.html#attr_android:inputType

于 2011-08-19T20:43:48.067 回答