首先声明下,这是本人自己使用的做法,可能并不适合每个人,但是具有参考意义,分享给大家,不足的地方希望有人能提出来。
ListView在做应用的时候是经常被使用到的。一般开发应用程序的时候,我们会先做界面。这个时候,遇到ListView,我们会先模拟一些数据,而且,每个ListView通常都有类型的行为,比如,ListView的每个Item的点击效果,Item之间的横线,等等,而通常我们不会去使用自带的list item 的布局,而是自己去写一个布局,然后在自定义的Adapter中去inflate它。在多个地方都使用到这些特性,那么我们就可以把这些特性放到父类中来处理。而对于界面中共同的元素我们会放到style中去处理。
先看MainAdapter.java:
public class MainAdapter extends BaseCompatableAdapter<Map<String, String>> { public MainAdapter(Context context, List<Map<String, String>> data) { super(context, data); } class ViewHolder { ImageView ivPic; TextView tvName; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder viewHolder; if (convertView == null) { convertView = super.layoutInflater .inflate(R.layout.list_item, null); viewHolder = new ViewHolder(); viewHolder.ivPic = (ImageView) convertView .findViewById(R.id.iv_pic); viewHolder.tvName = (TextView) convertView .findViewById(R.id.tv_name); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } //TODO 接下去对数据进行绑定... return convertView; } }
这里面做的事情非常简单,因为我把部分代码移到了父类BaseCompatableAdapter中,
下面看父类
BaseCompatableAdapter.java:
public abstract class BaseCompatableAdapter<T> extends BaseAdapter { protected Context context; private List<T> data; protected LayoutInflater layoutInflater; public BaseCompatableAdapter(Context context, List<T> data) { this.context = context; this.data = data; layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub if (data == null) return 0; return data.size(); } @Override public T getItem(int position) { // TODO Auto-generated method stub return data.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } }
覆写过BaseAdapter的同学应该可以知道,实际上就是把BaseAdapter的部分方法在这里面覆写了。以后你的其他的Adapter都继承自这个Adapter,那么可以省下不少的代码量。
最后看主界面:
MainActivity.java:
public class MainActivity extends Activity { private ListView lvData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvData = (ListView)findViewById(R.id.lv_data); List<Map<String, String>> dataList = new ArrayList<Map<String, String>>(); Map<String, String> map; for(int i = 0; i < 50; i++){//模拟数据量,当并没有加入真实的数据源 map = new HashMap<String, String>(); dataList.add(map); } lvData.setAdapter(new MainAdapter(this, dataList)); } }
上面是关于代码中如何较为简洁的处理ListView和Adapter,下面则是设置ListView的界面
用一个style来设置每个ListView公用的地方,如下:
res/values/styles.xml:
<resources>
<style name="listview_style" parent="@android:style/Widget.ListView">
<!-- <item name="android:listSelector">@drawable/list_item_bg_selecter</item> -->
<item name="android:divider">@drawable/line</item><!-- @drawable/list_item_line -->
<item name="android:cacheColorHint">@null</item>
</style>
</resources>
这里面设置了divider,即Item之间的横线,cacheColor设置为null,listSelector设置list item点击下去的效果。因为我将selector写到了list item里面去了,所以这里就注释掉了,实际上这里最好可以写入一个默认的selector,这样所有的listview的item都默认有一个selector样式!在一些情况下,比如List item中嵌套着一个ViewStub,那么这个时候你设置的listSelector会失效,这个时候,只能够在List item中设置背景selector,而且要注意,如果是ViewStub这种情况的话,不能将list item最外层的layout设置背景selector,而是要在除了ViewStub,在剩下的那个控件里面设置selector,即点击会显示或隐藏ViewStub的那个控件。
你的listview可以这样引用style:
<ListView android:id="@+id/lv_data" android:layout_width="fill_parent" android:layout_height="fill_parent" style="@style/listview_style" />
下面我们看看list Item
res/layout/list_item.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/list_item_bg_selecter" > <ImageView android:id="@+id/iv_pic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" android:layout_margin="5dip" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dip" android:layout_toRightOf="@+id/iv_pic" android:text="张三" /> </RelativeLayout>
注意在这里面我设置了android:background="@drawable/list_item_bg_selecter"这是关键,这里决定了ListView的每个Item的点击效果:但是这里也可以没有selector,如果没有的话,就会调用style中定义的selector,如果style中你没有设置,那么就会调用默认的selector(按下去橘黄色的那种效果)。
res/drawable/list_item_bg_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/list_item_bg_sel" android:state_pressed="true"/> <item android:drawable="@drawable/list_item_bg_sel" android:state_focused="true"/> <item android:drawable="@drawable/list_item_bg_sel" android:state_selected="true"/> <item android:drawable="@drawable/list_item_bg_nor"/> </selector>
这个selector中用到的图片可以是普通图片,也可以是自己画的图片,比如:
res/drawable/list_item_bg_sel.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#efece7" /> </shape>
list_item_bg_nor.xml也是一样,只不过设置不同的颜色。
当然横线你也可以自己画,比如:
res/drawable/line.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <stroke android:width="1dp" /> <size android:height="3dp" /> <solid android:color="#efece7" /> </shape>
下面附上效果图和项目结构图:
项目地址:
https://github.com/michaelye/ListViewStandardDemo
相关推荐
在Android应用设计中,ListView的使用能够帮助开发者有效地展示大量数据,并提供良好的用户交互体验。本实例将深入探讨ListView的各种视图模式以及如何自定义其内容。 1. 大图标视图(Large Icon View):在这种...
在本项目“ListView 安卓应用市场”中,我们将深入探讨如何使用ListView来模拟一个类似真实应用市场中的界面,展示一系列的应用图标、标题和简介。 首先,我们需要了解ListView的基本结构。ListView由多个列表项...
在C#编程中,ListView控件是一个非常常用且功能强大的组件,主要用于展示数据集合,它在Windows Forms和WPF环境中都有应用。这个控件可以显示数据列表,支持多种视图模式,如图标、详细信息、小图标、列表和报告等,...
在Android应用开发中,ListView是一种常用的视图组件,它允许用户滚动显示大量数据项的列表。ListView的定制开发是Android开发中的重要技能,因为它能够帮助开发者实现更丰富的用户体验和更高效的数据显示。本教程将...
在本文中,我们将深入探讨ListView中的几种位置关系以及如何在ListView中应用LayoutAnimation来增强用户体验。 首先,理解ListView的位置关系对于自定义适配器和处理点击事件至关重要。在ListView中,每个可视项都...
**事件处理**:在ListView中,事件处理主要涉及到OnClickListener或OnItemClickListener。设置监听器后,当用户点击列表项时,会触发相应的回调方法,我们可以在这里编写逻辑,比如播放景点的介绍音频、显示弹出窗口...
这只是一个基础的ListView应用,实际开发中,你可能需要处理更复杂的情况,如加载更多数据、异步加载数据、自定义复杂列表项等。理解并熟练掌握ListView的使用,对于Android开发者来说是非常必要的。
在Android应用开发中,ListView通常用于显示各种类型的数据集合,如联系人列表、邮件列表等。本案例主要围绕ListView的使用进行深入探讨。 首先,理解ListView的基本结构。ListView由多个列表项(List Item)组成,...
在Android移动应用开发中,ListView是一个非常重要的组件,它用于展示大量的数据集合,通常以列表的形式显示。在本教程中,我们将深入探讨ListView的简单使用,以实现标题、图片和网址的列表展示,并且在点击列表项...
ListView控件是Windows应用程序开发中常见的一种用户界面元素,它允许程序以列表形式展示数据,支持多种视图模式,如小图标、大图标、列表、详细信息等。在这个"listview控件应用实例"中,我们可以看到一位国外高手...
适配器的工作原理是将数据源中的每一项数据转化为一个View,然后添加到ListView中。例如,ArrayAdapter可以绑定一个数组或ArrayList,通过重写getView()方法来自定义每个列表项的显示样式。在SimpleAdapter中,我们...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要实现点击ListView的某一项(item)时,该item能够展开显示更多的内容,例如子列表或者详细信息。这个功能可以通过...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现像通讯录、消息列表等效果。ListView的高效利用是优化用户体验的关键,因为它能够动态加载数据,只渲染屏幕可见的部分,从而...
在Android应用开发中,ListView通常被用来显示各种类型的数据,如联系人、消息、菜单选项等。本教程将深入讲解ListView的开发实例,通过示例和案例,帮助你理解和掌握ListView的使用。 首先,我们要了解ListView的...
在Android开发中,ListView是一种常用的控件,用于展示大量...通过以上步骤,开发者能够灵活地在ListView中添加和定制HeadView,满足各种应用需求。在实际开发中,合理运用HeadView可以提高应用的可操作性和美观度。
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据的列表形式,通常用于实现下拉列表的效果。本教程将深入探讨ListView的应用实例,帮助开发者掌握如何在实际项目中有效地利用这一组件。 首先,...
在Android应用开发中,ListView是不可或缺的一个组件,它主要用于展示数据集合,并且能根据数据的数量自动调整自身高度,提供良好的滚动体验。以下是对ListView及其相关知识点的详细解释: 1. **ListView组件**: ...
在本文中,我们将深入探讨`fmx-listview`在Delphi XE10中的应用,这是一个强大的组件,用于创建各种列表和网格视图。`fmx-listview`是FireMonkey (FMX) 框架的一部分,适用于跨平台应用程序开发,支持Windows、macOS...
本示例中的"android listview局部刷新和模拟应用下载"正是探讨了如何在ListView中实现这一功能,并结合应用下载进度更新的场景进行演示。 首先,局部刷新通常通过Adapter来实现。Adapter是连接ListView和数据源的...
在.NET Framework中,ListView控件是Windows Forms应用程序中常用的一个组件,它允许开发者以列表的形式展示数据,可以用于展示数据库中的信息。这个“ListView控件显示数据库数据的C#源代码”实例,主要展示了如何...