我确实有一个列表与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,图像在过滤后没有更新,并且使用过滤后的列表,我无法更新视图。现在工作。