【问题标题】:highlight single item listview突出显示单个项目列表视图
【发布时间】:2018-04-07 16:44:01
【问题描述】:

我在使用列表视图突出显示单个项目时遇到了一些问题。我在下面的代码中创建了一个匿名适配器,但是当显示列表时,有几个项目具有突出显示/粗体。日志跟踪显示粗体/背景仅被调用一次,但有几个项目具有粗体,但只有正确的项目具有背景颜色设置。我为调试分离了背景颜色设置,但如果我只使用一个 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;
    }
};

【问题讨论】:

  • 正确地重新格式化您的代码。
  • 代码重新格式化。

标签: android listview android-arrayadapter


【解决方案1】:

我只是想补充一下,以防有人检查它。一个好的解决方案如下:

 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”。

无论如何,不​​确定是否有人会遇到这个问题,但我发现它很有帮助

【讨论】:

    【解决方案2】:

    显然,字体有一些“魔力”。我已将负责设置字体的部分更改如下:

    if(position == selection) {
        tv.setTypeface(Typeface.create(tf, Typeface.BOLD));
    }
    else {
        tv.setTypeface(Typeface.create(tf, Typeface.NORMAL));
    }
    

    它按预期工作。

    【讨论】:

    • 太棒了!!那解决了它。我怀疑这与 Android 优化有关,可能他们回收了字体。
    猜你喜欢
    • 2014-01-14
    • 2019-09-03
    • 2012-11-21
    • 1970-01-01
    • 2012-05-09
    • 2013-10-26
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多