【问题标题】:how to change the background color of the last item added to the list view?如何更改添加到列表视图的最后一项的背景颜色?
【发布时间】:2012-10-28 22:36:58
【问题描述】:

我对列表列表视图感到很困惑。我想在列表中最后添加的行中添加特定的颜色,我该怎么做?我用谷歌搜索了所有互联网和 stackoverflow 2 天,但我不知道怎么做??

我试过了

lv.getChildAt(lv.getLastVisiblePosition()). setBackgroundColor(Color.RED);

但到目前为止没有成功。我得到了随机行的颜色。但我只想为最近添加的项目着色。

有人可以给我建议吗?

非常感谢任何评论。

干杯

【问题讨论】:

    标签: android listview background-color


    【解决方案1】:

    出于效率原因,适配器有一个视图回收器,所以这就是“随机性”的来源......
    无论如何,只需创建一个自定义适配器来跟踪添加的最后一行的索引,并在 getView() 检查当前索引是否与最后一个索引匹配:

    • 如果是的话改变背景颜色
    • 如果不是 恢复原来的背景颜色。

    在 Google Talks 上观看 Android 的 Romain Guy explain the view recycler


    这是一个扩展 ArrayAdapter 的示例:

    public class MyArrayAdapter<T> extends ArrayAdapter<T> {
        private int lastAdded;
        public MyArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
            super(context, textViewResourceId, objects);
            lastAdded = objects.size() - 1;
        }
    
        @Override
        public void add(T object) {
            lastAdded = getCount();
            super.add(object);
        };
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            if(position == lastAdded) // Red 
                view.setBackgroundColor(0xffff0000);
            else // Transparent
                view.setBackgroundColor(0x00000000);
            return view;
        }
    
        @Override
        public void insert(T object, int index) {
            lastAdded = index;
            super.insert(object, index);
        };
    }
    

    注意:这并不全面。根据您使用适配器的方式,还有其他添加数据的方法,您可能希望或可能不希望覆盖这些数据。

    【讨论】:

    • 嗨,山姆,非常感谢您的帖子。我在这里感到困惑的是,在我的课堂上我已经在扩展 ListActivity 类。这听起来可能是一个愚蠢的问题,但你如何从活动中调用这个类?
    • 您可以将此代码剪切并粘贴到您的 ListActivity 类中,或者将一个名为 MyArrayAdapter.java 的新文件添加到您的项目中(它必须与该类同名)。然后像其他任何类一样引用这个类:setListAdapter(new MyArrayAdapter&lt;String&gt;(this, android.R.layout.simple_list_item_2, list));
    • 没问题,一开始可能会让人困惑。祝你好运!
    • 嗨山姆,这是完美的工作,但如果我想保留那些已经着色的颜色怎么办。我想让它们保持着色,但现在每次我添加一些东西时,只有最后一个会着色,而另一个不再着色。我已经注释掉了 view.setBackgroundColor(0x00000000);但还是一样。我真正需要做的是能够识别元素,比如每个元素都有唯一的 id。有没有办法做到这一点?我想我需要对此提出一个新问题:)
    • “我想让它们保持着色,但现在每次我添加一些东西时,只有最后一个会着色,而另一个不再着色。”这是适配器应该做的。您如何将数据添加到您的 ListView 以及如何删除颜色?
    【解决方案2】:

    通过调用lv.getChildAt(lv.getLastVisiblePosition()),您将获得最后一个可见且当前在屏幕上的孩子。

    如果您想更改列表最后一项上的任何内容,您必须在适配器的 getView 内检查 if(position == getCount()-1){ } 并在那里对其进行处理。

    【讨论】:

      【解决方案3】:

      您可以为此使用 customadapter 并覆盖 getView() 可以帮助您完成任务。

      public View getView (int position, View convertView, ViewGroup parent){
      
        // some task
         if(position == last) // once even try position == getCount() 
            {
            set background color to the view
            }
          return convertView;
      }
      

      最后一个是您将膨胀到列表视图的最后一个项目(可能是一个数组列表或数组或其他适合您要求的项目)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多