- 浏览: 532523 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
ListView数据项隔行换色控制实现
运行效果图:
[img]
[/img]
工程结构图:
[img]
[/img]
主类:
listview_items.xml
listview_item2.xml
main.xml
separator.xml
配置文件:
运行效果图:
[img]
[/img]
工程结构图:
[img]
[/img]
主类:
package com.amaker.list; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; /** * @Title: ListViewBackgroundDemoActivity.java * @Package com.xiaoma.listviewbackground * @Description: 小马学习隔行换色,一定仔细看注释 * @author XiaoMa */ public class ListViewBackgroundDemoActivity extends Activity implements OnItemSelectedListener{ private ListView lv = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lv = (ListView)findViewById(R.id.listview); /** * 设置快速滚动块可用,这个大家注意下,就是设置之后,ListView * 里面的数据条数必须大于一定数量(小马试了下,这个数量是大于一屏) * 才会显示这个小拖块,不然无效 */ lv.setFastScrollEnabled(true); lv.setOnItemSelectedListener(this); lv.setAdapter(new ListDemoAdapter(getApplicationContext())); } /** * @Title: ListViewBackgroundDemoActivity.java * @Package com.xiaoma.listviewbackground * @Description:适配器实现 * @author XiaoMa */ private class ListDemoAdapter extends BaseAdapter{ private static final int ITEM = 0; private static final int SEPARATOR = 1; private static final int TYPE_MAX_COUNT = SEPARATOR + 1; private LayoutInflater inflater = null ; private List<String> listItem = new ArrayList<String>(); /* * 用这个set来保存分隔线的位置,这个地方必须注意,小马写两个不同类型的Set来跟大家复习下 * 这两个小东东的不同之处,效果太神奇了,这个Set你该用哪个会直接影响到换色效果的,不同之 * 处是: * * TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序 * 或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法 * * Set:一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) * 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学 * 上的 set 抽象 */ @SuppressWarnings("rawtypes") //private Set set = new HashSet(); private TreeSet set = new TreeSet(); private Map map = new HashMap(); public ListDemoAdapter(Context context ){ this.inflater = LayoutInflater.from(context); /** * 大家稍微注意下这个循环,i从1开始?为什么? 小马在这犯的错 * 每5条数据加一条换色Item是用 i%6 == 0来控制的,如果这 * 个i值从0开始的话,会出现上面贴图中错误的换色,看图三,图四, * 原因是取余的时候小马犯了低级错误,小错,记下:两数取余,前者 * 大于后者时,取余会按正常取余来取,如果前者小于后者时,取余 * 后的值始终是前者,如果这个地方的i从0开始取的话,正好是满 * 足取余后的值等于0这个情况,就出现上面两图中的错误隔色图了, * 当前者大于等于后者时,这个隔色就又正常了,一定注意下,记在这, * 提醒大家也提醒自己,吼吼,听不明白的可以看下小马在工程中加的 * 一个测试类(测试取余规律的类PercentTest.java) */ //填充ListView for(int i=1;i<=50;i++){ this.listItem.add("添加的第"+i+"条数据"); if(i%6 == 0){ addSeparatorItem(); } Log.i("KKK", "添加的第"+i+"条数据"); } } /** * 添加换色项方法实现 * @param item */ @SuppressWarnings("unchecked") public void addSeparatorItem() { set.add(listItem.size()-1); notifyDataSetChanged(); } /** * 此处是根据特定值(在getView方法中加入) * 来判断应该绘制选项还是换色选项的分支值 * 由position返回view type id */ @Override public int getItemViewType(int position) { return set.contains(position) ? SEPARATOR : ITEM; } /** * 返回你有多少个不同的布局 */ @Override public int getViewTypeCount() { return TYPE_MAX_COUNT; } @Override public int getCount() { return listItem.size(); } @Override public Object getItem(int position) { return listItem.get(position); } @Override public long getItemId(int position) { return position; } /** * 这个地方也需要注意下,小马这个方法里面写的有点多了,其实官方是不支持在 * getView()方法中写太多的逻辑因为你手拖下屏幕,这个方法是逛调用 * 的,所以太多逻辑不适合放在这个地方,大家可自行调整下,但有些还是必 * 须的,写在这无防...吼吼 */ @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); XiaoMa xiaoMa = null; final int location = position; if(convertView == null){ switch (type) { //如果需要绘制选项时分支 case ITEM: xiaoMa = new XiaoMa(); convertView = inflater.inflate(R.layout.listview_items, null); xiaoMa.iv = (ImageView)convertView.findViewById(R.id.ItemImage); xiaoMa.tv = (TextView)convertView.findViewById(R.id.ItemTitle); xiaoMa.text = (TextView)convertView.findViewById(R.id.itemtext); xiaoMa.btn = (Button)convertView.findViewById(R.id.view_btn); break; //如果需要绘制换色选项时分支 case SEPARATOR: xiaoMa = new XiaoMa(); convertView = inflater.inflate(R.layout.listview_items, null); xiaoMa.iv = (ImageView)convertView.findViewById(R.id.ItemImage); xiaoMa.tv = (TextView)convertView.findViewById(R.id.ItemTitle); xiaoMa.text = (TextView)convertView.findViewById(R.id.itemtext); xiaoMa.btn = (Button)convertView.findViewById(R.id.view_btn); convertView = inflater.inflate(R.layout.separator, null); /* * 这个地方的drawable2用法跟在ListView换色选项布局中的 * android:background="@drawable/gradient_box" * 效果是一样的,小马写在这,熟悉下两种方式,大家根据自己需要改 */ Drawable drawable2 = getResources().getDrawable(R.drawable.gradient_box); xiaoMa.sep = (TextView)convertView.findViewById(R.id.sep); xiaoMa.sep.setBackgroundDrawable(drawable2); break; } /* * 此处小马犯错了,如果下面这句不加的话, * 加载时正常,拖动列表时就会报空指针了, * 小点注意下 */ convertView.setTag(xiaoMa); }else{ xiaoMa = (XiaoMa)convertView.getTag(); } xiaoMa.iv.setBackgroundResource(R.drawable.xiaolvzi); xiaoMa.tv.setText("这是第"+(position+1)+"个标题"); xiaoMa.text.setText("这是第"+(position+1)+"个概述"); /** * 按钮事件监听实现 */ xiaoMa.btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //单击Item按钮后,弹出提示 ShowDialog(location); } }); return convertView; } } /** * 弹出提示实现,这个地方扩展一下,细心的话大家会发现小马违反了方法命名规范,其实不是的, * 安卓Activity有临时弹出对话框方法的,跟下面这个方法只有一个字母之差(小马故意 * 首字母大写的),安卓自带弹出方法在这个方法下面的注释中 * @param posi */ private void ShowDialog(int posi){ Toast.makeText(getApplicationContext(), "单击了第"+(posi+1) +"个按钮", Toast.LENGTH_SHORT).show(); /* * 下面这两个方法大家熟悉吧?调用系统提供的临时弹出对话框,必须实现下面的 * onCreateDialog(int id)方法 */ showDialog(1);//弹出时可以做如:从服务器取数据等操作 /** * 这个地方小马就简单的睡眠5秒种来模拟从服务器下载数据完成后关闭对话框 */ new Thread(new Runnable() { @Override public void run() { try { Log.i("KKK", "已进入睡眠"); Thread.sleep(3000); dismissDialog(1);//隐藏 表示数据下载完毕等的... } catch (Exception e) { e.printStackTrace(); } } }).start(); } @Override protected Dialog onCreateDialog(int id) { /* * 下面这个构造器中的this不能用getApplicationContext()来代替, * 但可用类名.this来代替,没有为什么, 必须这样写!!!这个地方小马晕了 * 不少时间,如果直接get....代码没错,但还是会报错,很邪门的哦 ... */ ProgressDialog dialog = new ProgressDialog(this); //小测试,中文就临时写这了,大家要注意把内容都写到string.xml中去,好习惯从小开始养,嘿嘿 dialog.setCancelable(false);//设置用户不能用返回键取消对话框 dialog.setIcon(getResources().getDrawable(R.drawable.xiaolvzi)); dialog.setTitle("那些年,我们一起追的女孩"); dialog.setMessage("小马果 呆丫头 O_O"); dialog.show(); return dialog; } /** * @Title: ListViewBackgroundDemoActivity.java * @Package com.xiaoma.listviewbackground * @Description: 为提高加载效率而写的类,可以看下ListView优化 * @author XiaoMa */ public final class XiaoMa{ public ImageView iv ; public TextView tv ; public Button btn ; public TextView text; public TextView sep; } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { } @Override public void onNothingSelected(AdapterView<?> parent) { } }
listview_items.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@drawable/item_bg" > <ImageView android:id="@+id/ItemImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:paddingTop="12dip" /> <TextView android:id="@+id/ItemTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/view_btn" android:layout_toRightOf="@id/ItemImage" android:textColor="#000000" android:textSize="20dip" /> <TextView android:id="@+id/itemtext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/ItemTitle" android:textColor="#000000" android:layout_marginTop="10dip" android:layout_toRightOf="@+id/ItemImage" android:textSize="10dip" /> <Button android:id="@+id/view_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_alignParentRight="true" android:text="XiaoMa" /> </RelativeLayout>
listview_item2.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/item_bg" android:orientation="horizontal" > <LinearLayout android:id="@+id/main" > <ImageView android:id="@+id/ItemImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:paddingTop="12dip" /> <TextView android:id="@+id/ItemTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/view_btn" android:layout_toRightOf="@id/ItemImage" android:textColor="#000000" android:textSize="20dip" /> <TextView android:id="@+id/itemtext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/ItemTitle" android:layout_marginTop="10dip" android:layout_toRightOf="@+id/ItemImage" android:textColor="#000000" android:textSize="10dip" /> <Button android:id="@+id/view_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:gravity="center" android:text="XiaoMa" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/main" > <TextView android:id="@+id/sep" android:layout_width="fill_parent" android:layout_height="wrap_content" android:focusable="false" android:text="吼吼" /> </LinearLayout> </RelativeLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- Back Up <ListView android:id="@+id/listview" android:layout_width="wrap_content" android:layout_height="fill_parent" android:smoothScrollbar="true" android:drawSelectorOnTop="false" android:listSelector="#00000000" /> --> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:smoothScrollbar="true" android:choiceMode="none" android:focusable="false" android:scrollingCache="false" android:clickable="false" android:dividerHeight="0.5dip" /> <!-- <ListView android:id="@+id/list_coupon" android:layout_height="wrap_content" android:drawSelectorOnTop="false" android:choiceMode="none" android:focusable="false" android:scrollingCache="false" android:fadingEdge="none" android:focusableInTouchMode="false" android:clickable="false" android:dividerHeight="0.5dip" android:divider="@drawable/separator" /> --> </LinearLayout>
separator.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/sep" android:layout_width="fill_parent" android:layout_height="wrap_content" android:focusable="false" android:textColor="#000000" android:gravity="center_horizontal" android:text="哈哈哈,这就是个换行标志 " /> </LinearLayout>
配置文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.amaker.list" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/xiaoma" android:label="@string/app_name" > <activity android:name=".ListViewBackgroundDemoActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
发表评论
-
Android中如何模拟一次点击(touch)事件
2014-05-06 10:41 0在Android中有时需要模拟某一个View的touch事件, ... -
Android程序Crash时的异常上报
2014-04-28 18:15 0http://blog.csdn.net/singwhatiw ... -
android程序中证书签名校验的方法
2014-04-28 17:58 2004android程序中证书签名校验的方法一 2013-02 ... -
MD5理解错了,哎
2014-03-17 14:14 0MD5只对数据加密是无法解密的,也就是说,你把100加密后,就 ... -
Android 获取网络时间
2014-03-12 11:42 2040Android 获取网络时间 在网上看到的最常见的方式有: ... -
SQLite清空表并将自增列归零
2014-03-05 18:02 1550SQLite清空表并将自增列归零 作者:Zhu Yanfeng ... -
Handler小看一下
2013-11-11 16:42 0android handler调用post方法还是阻塞 su ... -
Frame Animation小看一下
2013-10-12 16:30 780Demo运行效果图: 源码: -
动画小学一下
2013-10-12 16:14 735转自: http://www.eoeandroid.com/f ... -
Android 动画之ScaleAnimation应用详解
2013-10-12 15:49 1004===============eoeAndroid社区推荐:= ... -
android开发中的一个工具类
2013-06-19 16:04 0package com.wanpu.login.dialog; ... -
android TextView怎么设置个别字体颜色并换行?
2013-06-20 09:25 1683(1)、TextView 设置个别字体颜色 TextView ... -
Android开发之文件下载,状态时显示下载进度,点击自动安装
2013-05-07 15:38 1429在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载 ... -
android中的状态保存
2013-04-07 14:21 976package com.zzl.call; import ... -
android动画基础:tween动画
2013-04-06 11:21 1238工程结构图: [img] [/img] 四个动画的xml ... -
面试中遇到的几个问题
2013-06-09 11:56 990SAX与DOM之间的区别 SAX ( ... -
Android获取其他包的Context实例,然后调用它的方法,反射!!!
2013-03-25 10:32 1221Android中有Context的概念,想必大家都知道。Con ... -
Android的内存机制和常见泄漏情形
2013-03-06 16:55 793一、 Android的内存机制 Android的程序由Ja ... -
JUnit测试小小demo
2013-03-06 16:37 1158运行效果图: [img] [/img] 项目结构图 ... -
android开发中的异常小工具
2013-03-04 15:53 899package com.zzl.tools; impor ...
相关推荐
在某些情况下,为了提高数据的可读性和视觉效果,开发者可能会希望实现ListView的隔行变色功能。这可以通过编程方式实现,使得每两行之间具有不同的背景颜色,以创建一种对比,使用户更容易区分每一行。 标题"VB ...
"VC++ 让ListCtrl隔行换色"这个主题涉及的是如何在ListCtrl的报告视图中实现行的交替颜色,以提高用户界面的可读性和美观性。 首先,要实现这一功能,你需要理解MFC中的CListCtrl类,它是对Windows API中的ListView...
在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。然而,有时我们需要在同一个ListView中展示多种类型的视图(Item),比如一个列表中既有图片又有文字,或者不同的条目有不同的布局。这时,我们...
为了提高用户体验,我们经常需要对ListView的每一项进行个性化设计,比如隔行显示不同的颜色。本篇将详细介绍如何通过继承`SimpleAdapter`来实现这个功能。 首先,我们要理解`SimpleAdapter`的作用。它是Android ...
"listview隔行着色"是指在ListView中实现交替行颜色显示,通常是为了提高用户体验,使用户更容易区分不同的列表项。这一功能在很多应用中都能见到,如邮件应用、通讯录等。 要实现ListView隔行着色,主要涉及以下...
本文将深入探讨如何实现ListView的隔行显示效果,以及在实际应用中可能遇到的单元格绑定问题。 首先,让我们来理解“隔行显示”这个概念。在ListView中,隔行显示通常指的是通过改变奇偶行的背景颜色或者样式,使得...
ListView通过ItemsControl的子类实现,它使用ItemTemplate来决定如何显示每个数据项。默认情况下,当用户选择一个项目或鼠标悬浮在某一行上时,系统会自动设置背景色。然而,这些默认样式可能并不符合所有设计需求,...
- **项(Items)**:ListView的每一行数据称为一个项,每个项可以包含多个子项(SubItems)。 - **子项(SubItems)**:项下的具体信息,对应于列头下的值,如在详细信息视图中,每个列对应一个子项。 - **图像...
本主题将深入探讨如何实现“C# WinForm ListView控件美化”,包括重画列头、选中时的颜色改变以及隔行换色功能。 首先,让我们了解ListView控件的基本用法。ListView控件有多种视图模式,如List、SmallIcon、...
通过重绘ListView,我们可以改变其背景色、文字颜色、边框样式,甚至添加自定义的图标和动画效果。 首先,要进行控件重绘,我们需要继承自System.Windows.Forms.ListView类,并覆写OnPaint方法。在这个方法中,可以...
为了提高用户体验和视觉效果,我们常常需要对ListView的背景进行定制,比如实现隔行显示不同的颜色,或者动态改变颜色。本篇文章将深入探讨如何设置ListView的隔色背景,并提供实际的代码示例。 1. **基础设置** ...
- 设置`android:cacheColorHint="#00000000"`可以消除ListView之间的隔行背景色,减少内存消耗。 5. **接口回调**: - 设计一个回调接口,由Activity或Fragment实现,当ListView滚动到底部时,调用接口方法加载新...
这段代码中,`Container.DisplayIndex` 是ListView项的数据索引,% 2 操作用于判断当前行是否为偶数行。如果是偶数行(索引为0、2、4等),背景颜色设为白色;否则,背景颜色设为淡灰色(#EEEEEE)。 另一种方法是...
ListView是Android提供的一个可以显示大量数据的视图,通过Adapter将数据与视图绑定,动态加载列表项。每个列表项称为一个Item,可以通过自定义布局文件来设计Item的显示样式。 在实现微信右滑删除功能时,主要涉及...
实例135 在datagridview控件中隔行换色 实例136 连接excel文件 实例137 读取和保存用户头像 实例138 判断是否重复输入数据 实例139 删除datagridview控件中的指定行 实例140 将access数据库导入excel文件中 第13章 ...
实例135 在datagridview控件中隔行换色 231 实例136 连接excel文件 232 实例137 读取和保存用户头像 233 实例138 判断是否重复输入数据 235 实例139 删除datagridview控件中的指定行 237 实例140 将access数据库导入...