突出显示单个项目列表视图
highlight single item listview
我在使用列表视图突出显示单个项目时遇到了一些问题。我已经按照下面的代码创建了一个匿名适配器,但是当显示列表时,有几个项目有 highlight/bold。日志跟踪显示 bold/background 仅被调用一次,但有几个项目具有粗体,但只有正确的项目具有背景颜色设置。我将背景颜色设置分开进行调试,但如果我只使用一个 if(position==selection) 检查,结果是一样的。
请注意,这不是交互式列表视图,不需要 onclicklistener。
如有任何帮助,我将不胜感激。提前谢谢你。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, times) {
@Override
public View getView(int position, View cview, ViewGroup group) {
int count = 0; //used for debugging
View view = super.getView(position, cview, group);
TextView tv = (TextView)view.findViewById(android.R.id.text1);
Typeface tf = tv.getTypeface();
Log.d("log", "position = " + position);
if(position == selection) {
tv.setTypeface(tf, Typeface.BOLD);
Log.d("log", "BOLD" + position + "count=" + (count ++));
} else {
tv.setTypeface(tf, Typeface.NORMAL);
}
if(position == selection) {
view.setBackgroundColor(Color.LTGRAY);
Log.d("log", "Bkgnd " + position + "count: " + count);
} else {
view.setBackgroundColor(Color.WHITE);
}
return view;
}
};
显然,有一些 "magic" 带有字体。我已经将负责设置字体的部分更改如下:
if(position == selection) {
tv.setTypeface(Typeface.create(tf, Typeface.BOLD));
}
else {
tv.setTypeface(Typeface.create(tf, Typeface.NORMAL));
}
它按预期工作。
我只是想补充一下以防有人检查。一个好的解决方案如下:
public View (int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, parent, false);
}
TextView textView = convertView.findViewById(R.id.mytextview);
if(position == selection) {
textView.setBackgroundColor(Color.parseColor("#88FFFFFF");
} else {
textView.setBackgroundColor(Color.parseColor("#00000000");
}
return convertView;
}
这样做是将背景颜色设置为白色,选择时使用 50% 的 alpha,未选择时使用 0% 的透明透明。这会使所选项目更亮一点但颜色相同。
通过在 xml 中将 android:listSelector 设置为“#88FFFFFF”可以找到类似的效果,但在 getView() 函数中执行此操作允许以不同方式突出显示多个元素,同时保持相同的颜色主题。我在我的程序中使用它来突出显示列表视图中的某些项目,其中“#88000000”是一个较暗的项目加上“#88FFFFFF”用于所选项目。
无论如何,不确定是否有人会遇到这个问题,但我发现它对我有所帮助
我在使用列表视图突出显示单个项目时遇到了一些问题。我已经按照下面的代码创建了一个匿名适配器,但是当显示列表时,有几个项目有 highlight/bold。日志跟踪显示 bold/background 仅被调用一次,但有几个项目具有粗体,但只有正确的项目具有背景颜色设置。我将背景颜色设置分开进行调试,但如果我只使用一个 if(position==selection) 检查,结果是一样的。
请注意,这不是交互式列表视图,不需要 onclicklistener。
如有任何帮助,我将不胜感激。提前谢谢你。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, times) {
@Override
public View getView(int position, View cview, ViewGroup group) {
int count = 0; //used for debugging
View view = super.getView(position, cview, group);
TextView tv = (TextView)view.findViewById(android.R.id.text1);
Typeface tf = tv.getTypeface();
Log.d("log", "position = " + position);
if(position == selection) {
tv.setTypeface(tf, Typeface.BOLD);
Log.d("log", "BOLD" + position + "count=" + (count ++));
} else {
tv.setTypeface(tf, Typeface.NORMAL);
}
if(position == selection) {
view.setBackgroundColor(Color.LTGRAY);
Log.d("log", "Bkgnd " + position + "count: " + count);
} else {
view.setBackgroundColor(Color.WHITE);
}
return view;
}
};
显然,有一些 "magic" 带有字体。我已经将负责设置字体的部分更改如下:
if(position == selection) {
tv.setTypeface(Typeface.create(tf, Typeface.BOLD));
}
else {
tv.setTypeface(Typeface.create(tf, Typeface.NORMAL));
}
它按预期工作。
我只是想补充一下以防有人检查。一个好的解决方案如下:
public View (int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, parent, false);
}
TextView textView = convertView.findViewById(R.id.mytextview);
if(position == selection) {
textView.setBackgroundColor(Color.parseColor("#88FFFFFF");
} else {
textView.setBackgroundColor(Color.parseColor("#00000000");
}
return convertView;
}
这样做是将背景颜色设置为白色,选择时使用 50% 的 alpha,未选择时使用 0% 的透明透明。这会使所选项目更亮一点但颜色相同。
通过在 xml 中将 android:listSelector 设置为“#88FFFFFF”可以找到类似的效果,但在 getView() 函数中执行此操作允许以不同方式突出显示多个元素,同时保持相同的颜色主题。我在我的程序中使用它来突出显示列表视图中的某些项目,其中“#88000000”是一个较暗的项目加上“#88FFFFFF”用于所选项目。
无论如何,不确定是否有人会遇到这个问题,但我发现它对我有所帮助