java - 在 ListView 中滚动会丢失文本颜色和字体
问题描述
我不确定为什么它不起作用,但我的代码应该做的非常简单。
我有一个在 getView() 中声明的具有默认文本颜色 (BLACK) 和字体 (MONOSPACE) 的 ListView,因此在创建视图时一切正常。
当我从列表中选择一个项目时,它应该将文本颜色更改为 RED,将字体更改为 MONOSPACE 和 BOLD,如果我单击另一个项目,它将将该项目更改为 RED 和 BOLD,并将之前的文本返回为 BLACK 和 NORMAL。这工作得很好,但是如果我从红色和粗体文本滚动到它不可见,然后向后滚动,文本不再是红色和粗体,而是黑色和正常。
非常感谢您的帮助!谢谢
private ArrayList<String> list;
private ListView myView;
private ListAdapter listAdapter;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("Hello world " + i);
}
listAdapter = new ListAdapter();
myView = (ListView) findViewById(R.id.myList);
myView.setAdapter(listAdapter);
myView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tv = (TextView) view.findViewById(R.id.textView);
tv.setTextColor(Color.RED);
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
}
});
}
public class ListAdapter extends BaseAdapter {
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = getLayoutInflater().inflate(R.layout.listview_layout, null);
TextView txt = (TextView) view.findViewById(R.id.textView);
txt.setText(list.get(i));
txt.setTextColor(Color.BLACK);
txt.setTypeface(Typeface.MONOSPACE, Typeface.NORMAL);
return view;
}
}
解决方案
好的,首先你应该通过一个标志来保持行之间的样式差异。因此,您应该考虑一个包含一对字符串和一个标志的列表,而不是将一个字符串列表传递给适配器。发生此问题是因为 ListView 拥有有限的视图计数,并且在发生滚动时,它会为它们分配值。
public class MainActivity extends AppCompatActivity {
private List<Pair> list;
private ListAdapter listAdapter;
private ListView myView;
private int lastClickedPosition = 0;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add(new Pair("Hello world " + i, false));
}
listAdapter = new ListAdapter();
myView = (ListView) findViewById(R.id.myList);
myView.setAdapter(listAdapter);
myView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
list.get(lastClickedPosition).flag = false;
list.get(position).flag = true;
lastClickedPosition = position;
listAdapter.notifyDataSetChanged();
}
});
}
public class ListAdapter extends BaseAdapter {
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = getLayoutInflater().inflate(R.layout.listview_layout, null);
TextView txt = (TextView) view.findViewById(R.id.textView);
txt.setText(list.get(i).text);
if (list.get(i).flag) {
txt.setTextColor(Color.RED);
txt.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
} else {
txt.setTextColor(Color.BLACK);
txt.setTypeface(Typeface.MONOSPACE, Typeface.NORMAL);
}
return view;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
}
static class Pair {
String text;
boolean flag;
Pair(String text, boolean flag){
this.text = text;
this.flag = flag;
}
}
}
推荐阅读
- python - 如何在使用 python igraph 创建的有向图中向边缘标签添加权重?
- angular - mat-menu 总是出现在页尾
- r - 基于日期范围的循环分配ID,如何提高代码效率?
- excel - 如何格式化电子邮件的正文
- number-systems - 大家好。我正在努力将二进制转换为十进制作为 8 位数字
- c++ - 线程指针向量,push_back 导致崩溃
- ios - 安排每小时重复本地通知的问题
- python - 尝试求解隐式方程时,UnboundLocalError '在赋值前引用'
- flutter - 将 onTap 函数传递给颤振中的另一个小部件
- sas - 我使用什么代码在 SAS 中创建 1-50 内的第一个素数?