Android中的自定义ListAdapter不像预期的那样工作,特别是当过滤时



我确实有一个列表与imageviews在每一行。在某些行中,我想显示这些图像,在某些我不想显示它们,所以我使用自定义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是不可见的,并根据如上所示的条件变得可见。textview是黑色的,并根据另一个条件获得另一个文本颜色。

我的问题是,这对于像1-5个项目这样的小列表很好,但是当列表变长时,这并不像预期的那样工作。结果有时是错误的,当我基于相同的数据重新加载listview时,我可能每次都会看到不同的结果。图片设置错误或文字颜色设置错误。

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

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

事先感谢您的帮助

适配器视图会被循环使用,所以你必须考虑所有的路径,例如:

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

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

不知道你的过滤器问题,我的直觉是它与上面的问题有关。

对于第一个问题:

@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 # 58;//developer.android.com/reference/android/widget/TextView.html # attr_android: inputType

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

最新更新