`
gk23
  • 浏览: 177252 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)自定义Android的ListView布局和各Item的背景色

 
阅读更多

     Android中的ListView是用得非常频繁的一种组件,同时ListView也是一种很强大的组件,你可以为每一行自定义布局,也可以修改各行的 背景色。自定义布局比较容易,自己实现一个layout的布局文件,然后在adapter的getView里读入就可以了。需要注意的是,在 getView中不需要每次都加载layout文件,因为ListView会重复利用已生成的Item。所以每次拖动上下滚动条的时候其实每行的Item 变化的只是显示的内容,就窗体本身而言是不变的,Android SDK里自带的例子是最好的说明。

        /**
         * Make a view to hold each row.
         *
         * @see android.widget.ListAdapter#getView(int, android.view.View,
         *      android.view.ViewGroup)
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            // A ViewHolder keeps references to children views to avoid unneccessary calls
            // to findViewById() on each row.
            ViewHolder holder;

            // When convertView is not null, we can reuse it directly, there is no need
            // to reinflate it. We only inflate a new View when the convertView supplied
            // by ListView is null.
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

                // Creates a ViewHolder and store references to the two children views
                // we want to bind data to.
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.text);
                holder.icon = (ImageView) convertView.findViewById(R.id.icon);

                convertView.setTag(holder);
            } else {
                // Get the ViewHolder back to get fast access to the TextView
                // and the ImageView.
                holder = (ViewHolder) convertView.getTag();
            }

            // Bind the data efficiently with the holder.
            holder.text.setText(DATA[position]);
            holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

            return convertView;
        }

        static class ViewHolder {
            TextView text;
            ImageView icon;
        }
    }

 

Android的界面开发模式决定了实现某一种风格的组件存在很多种方法,而如果没有对它的界面框架有个比较全面的理解的话往往实现起来要走很多弯路,譬如给各item设置背景色。因为在邮件列表中要显示两种颜色,已经阅读过的和未读的邮件以不同的背景色标识。

在item的layout文件里只能设置一中固定的颜色,这当然不是我想要的。

最直接的思路就是在Adapter的getView中根据position的不同来设置不同的背景色,但是设置了不同颜色后发现在屏幕上选中一行时背景色没有变化,选中跟没选中的颜色是一样的。于是又重新设置selector,但仍然不起作用。

看来getView中返回的View就是ListView中各行最终显示界面,所以又想着先在ListView的 OnItemClickListener中记录当前选中的Item,然后在getView中判断是不是该行,如果是,就设置为选中的背景色。但是这种方法 存在很大的问题,第一个问题就是onItemClickListener是在用户点击之后调用的,所以背景色的改变也是用户点完了之后才发生,而正确的应 该是press的一瞬间改变背景色。第二个问题是,再返回到该ListView时需要在代码里重新清楚选中行的记录,否则该行的背景色不会刷新。

最终的解决方法是这样的:

实现两个selector文件(正常显示下有几种背景色就需要几个这样的selector文件)

mail_read_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android ">
<item
 android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@color/ltgray" />
<item android:state_pressed="true"
    android:drawable="@color/red" />
<item android:state_selected="true"
 android:state_pressed="false"
    android:drawable="@color/red" />
</selector>

mail_unread_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android ">
<item
 android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@color/white" />
<item android:state_pressed="true"
    android:drawable="@color/red" />
<item android:state_selected="true"
 android:state_pressed="false"
    android:drawable="@color/red" />
</selector>

在getView中根据邮件不同的状态设置不同的颜色方案
if unread
    convertView.setBackgroundResource(R.drawable.mail_unread_bg);
 else
    convertView.setBackgroundResource(R.drawable.mail_read_bg);

分享到:
评论

相关推荐

    android listview item背景色点击效果实例

    本实例“android listview item背景色点击效果”正是针对这一需求进行的开发。 在Android中,ListView的每个项(item)都是一个View或ViewGroup,通常我们通过自定义布局文件来设计每个item的显示样式。为了实现...

    listview中改变item背景颜色

    默认情况下,ListView的每个Item(列表项)背景色可能并不符合所有开发者的设计需求。谷歌SDK提供的默认样式中,Item的背景颜色可能是黄色,但这可以通过自定义来改变,以满足个性化设计或品牌风格的要求。在本篇...

    android listview 自定义样式实例

    还可以通过`setSelector()`设置选中项的背景色,或者使用`Animation`类添加滑动进入、退出等动画效果。 9. **自定义Header和Footer**: - 如果需要在ListView的顶部或底部添加额外的视图,如头部广告或页脚提示,...

    Android ListView 选中效果 自定义

    总之,自定义Android ListView的选中效果涉及到Drawable状态选择器、Item布局、Adapter以及事件监听等多个方面。通过灵活运用这些技术,开发者可以创建出各种独特的交互体验,使应用更加吸引人。

    ListView选中item颜色改变

    在这个布局文件中,可以设置一个背景颜色,例如使用`android:background="@drawable/list_item_selector"`,这里`list_item_selector`是一个颜色选择器资源。 2. **创建颜色选择器资源** 在res/drawable目录下创建...

    android——仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

    在Android开发中,实现类似网易今日头条的频道列表滑动效果,即当用户滑动列表时,某个item(列表项)可以被拖动并吸附到顶部的另一个View中,这种功能通常涉及到自定义视图、触摸事件处理以及动画的运用。...

    android listView 改变选中行的 字体颜色和 图片

    要改变ListView选中行的字体颜色和图片,我们需要理解ListView的工作原理,以及如何自定义其Adapter和视图。以下是一些关键知识点的详细介绍: 1. **ListView的基本使用**: - ListView是一个视图容器,它能加载...

    Android开发--自定义控件实现listview的滑动删除item

    例如,当Item向左滑动时,背景色逐渐变为警告色,同时删除按钮逐渐露出。 4. **处理点击事件**: 当删除按钮完全显示并被点击时,触发删除操作。此时,需要与Adapter协作,从数据源中移除对应的项,并通知Adapter...

    实现android listview可拖动item

    当我们想要实现拖动功能时,通常需要自定义ListView的适配器和每个item的布局。 1. **自定义Adapter** 创建一个继承自BaseAdapter的自定义Adapter,重写其中的方法,如`getView()`。在这个方法中,我们将添加拖动...

    Android ListView使用技巧

    对于包含复杂布局的item,可以使用`setCacheColorHint()`设置背景色,减少重绘次数。另外,开启`setSmoothScrollbarEnabled(true)`可以平滑滚动,提高用户感知。 9. **空视图(Empty View)** 当ListView没有数据...

    ListView中实现自定义图片背景,无闪烁,背景不随ScrollBar移动

    3. **优化滚动性能**:启用ListView的`cacheColorHint`特性,通过`android:cacheColorHint="@android:color/transparent"`,让ListView缓存一个透明色,以减少不必要的绘制操作。 4. **ScrollBar与背景分离**:默认...

    android listview点击保持背景颜色,实现已读功能

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。在许多应用中,我们经常需要实现点击ListView项后保持其背景颜色,以显示已读或未读的状态,这样用户可以清楚地看到哪些项已被查看。本教程将...

    Android 自定义listView

    本篇文章将深入讲解如何自定义ListView,包括自定义`getView()`方法、改变选中行的字体大小和颜色、背景色以及添加按钮等功能。 首先,我们需要创建一个适配器(Adapter),通常使用BaseAdapter作为基础,因为它的...

    Android 实现气泡式listview

    在Android开发中,气泡式ListView是一种常见的UI设计,它以独特的气泡形状展示列表项,通常用于消息通知、评论展示等...总的来说,自定义ListView是Android开发中的一个重要技能,需要不断学习和实践才能掌握得更好。

    Android ListView的item背景色设置和item点击无响应的解决方法

    如果需要修改为自定义的背景颜色,一般情况下有三种方法: 1)设置listSelector 2)在布局文件中设置item的background 3)在adapter的getview中设置 这三种方法都能达到改变item默认的背景色和按下颜色,下面来...

    listview item子控件删除跳转,点击更改背景色

    通常,ListView的每个item都是由一个自定义的View(如LinearLayout或RelativeLayout)组成,里面包含多个子视图,如TextView、ImageView等。我们需要为这些子控件设置OnClickListener。在监听器的onClick方法中,...

    android ListView和GridView拖拽移位实现代码

    在Android开发中,ListView和GridView是两种常用的布局控件,用于展示大量的数据列表。它们都是AdapterView的子类,能够动态加载数据并显示。本文将深入探讨如何在Android中实现ListView和GridView的拖拽移位功能,...

    圆角背景的ListView

    总之,“圆角背景的ListView”这个主题涵盖了Android自定义Adapter、布局设计、性能优化以及状态选择器等关键知识点,对于开发者来说,理解和掌握这些内容对于创建美观且高效的列表视图至关重要。通过实践和学习,...

    立体感listview

    自定义的ListView Adapter需要继承`BaseAdapter`,并实现其中的`getView()`方法,这里可以为每个item加载特定的布局,并应用相应的动画和样式。 此外,我们还可以使用自定义的Drawable来实现立体感。例如,创建一个...

    Android ListView单选

    然后,在Activity中找到这个ListView并设置适配器,适配器通常是继承自BaseAdapter的自定义类,负责填充数据和渲染视图。例如: ```java ListView listView = findViewById(R.id.myListView); ArrayAdapter&lt;String&gt;...

Global site tag (gtag.js) - Google Analytics