Android中的自定义ListAdapter未按预期工作,尤其是在过滤时

时间:2011-08-19 20:00:15

标签: android listview filter listadapter simpleadapter

我的每一行都有一个包含图像视图的列表。在某些行中,我想显示那些图像,在某些行中我不想透视它们,所以我使用自定义ListAdapter:

List Row 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。默认情况下,ImageView是不可见的,并根据上面显示的条件显示。 TextVoews是黑色的,并根据另一个条件获得另一种文本颜色。

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

第二个问题是,当我对适配器应用过滤器时,这完全肯定是wron。我有一个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的那一刻起,整个列表视图完全改变,现在基于条件的格式化似乎不仅“有时是错误的”,而且现在“完全没有任何逻辑”。

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

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

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

if(condition == true){

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

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

对于您的过滤器问题一无所知,我的预感是它与上述相同的问题有关。

答案 1 :(得分: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

答案 2 :(得分:0)

所以我最后改变了SimpleAdapter,我不得不使用ArrayAdapter并且没有使用默认的Filter方法,而是实现了一个过滤ArrayList并将过滤后的ArrayList设置为Adapters List的方法。现在它有效。使用SimpleAdapter,图像在过滤后没有更新,并且使用过滤后的列表,我无法更新视图。立即行动。