如何解决ListView自定义适配器对错误的项目OnScroll应用操作
我对ListView
和自定义ArrayAdapter
进行了常规设置。
而我规定如果某物等于某物,则更改该物品的颜色。
在第一次加载时,该条件适用于我更改其颜色的正确项目(如果有条件)。
当我不断向上和向下滚动ListView
时,问题开始出现,错误项目的颜色会随机变化,并随着我不断滚动而恢复为原始状态。即使是正确的随机变化。直到我得到列表上所有具有该颜色的商品!
让我们说只有一项具有(true)值,其余项是(false),然后我将如果为true ,则更改颜色。但是当我滚动(不是在第一次加载时)其他项目也会获得该颜色,即使它们为 false 。
但是我用disabledTextView.setText("correct item");
设置的数据没有改变,它保持正确,这很好。
MyCustomAdapter.java
public class MyCustomAdapter extends ArrayAdapter<HashMap<String,String>> {
private Context context;
private ArrayList<HashMap<String,String>> myArray;
public MyCustomAdapter(Context context,ArrayList<HashMap<String,String>> theArray) {
super(context,R.layout.my_single_list_item,theArray);
this.context = context;
this.myArray = theArray;
}
@NonNull
@Override
public View getView(int position,@Nullable View convertView,@NonNull ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.my_single_list_item,parent,false);
}
HashMap<String,String> arrayItem = myArray.get(position);
boolean disabled = Boolean.valueOf(arrayItem.get("disabled"));
TextView disabledTextView = convertView.findViewById(R.id.disabledTextView);
disabledTextView.setText(String.valueOf(disabled));
if(disabled) {
disabledTextView.setTextColor(getContext().getResources().getColor(R.color.design_default_color_error));
}
return convertView;
}
}
my_single_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/disabledTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="@android:color/black" />
</LinearLayout>
什么原因导致此问题?
更新(已解决):但仍需要更多信息!
在摆脱使用convertView
并用新customView
替换为LayoutInflater
的情况下:
public View getView(int position,View convertView,ViewGroup parent) {
View customView = LayoutInflater.from(getContext()).inflate(R.layout.my_single_list_item,false);
}
TextView hotspotUserDisabled = customView.findViewById(R.id.hotspotUserDisabled);
//.. etc
问题已解决。我对此仍然感到困惑,仅在View
为 null 时才应该使用新的View convertView
膨胀吗?
因为 IDE 显示提示:
实现视图适配器时,应避免无条件扩大新的布局; 如果传递了可用项目以供重复使用,则应尝试使用该项目。 例如,这有助于使ListView滚动更加平滑。
如果我需要解决此问题并且仍然使用传递的View
来保持滚动平滑怎么办?
谢谢!
解决方法
您需要在 getView 方法
中定义其他情况if(disabled) {
disabledTextView.setTextColor(getContext().
getResources().getColor(R.color.design_default_color_error));
}else{
// add code here
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。