该功能基于多个成熟的博客和demo的集成,最适合开发的方式推荐。
首先是利用baseAdapter开发listview,baseAdapter拓展性自由性非常高,利用activity加载适配器Adapter再加载资源进入视图view中,图片imageview textview 等都可以自由的组织布局。在一个额外的xml布局中写好单个list项目的布局就可以自由的适配载入整个list 参考自定义BaseAdapter demo针对arrayAdapter simpleAdpter等四个适配器的比较。
其次是下拉刷新的功能,虽然网上有很多例子,但是不是继承FrameLayout 就是集成activity。很少有继承listactivity并且还使用baseAdapter的例子。这里主要参考的是Android中实现下拉刷新以及Android:ListView使用RelativeLayout与TableLayout比较 这里的关键并不是头尾的算法和头尾的布局,关键的是如何将listview嵌入另一个布局中并保持布局的稳定和及时性。由于使用的是baseAdapter数据不是直接在activity里添加而是通过继承自baseAdapter的适配器调用getView函数获得的,因而数据的呈现极其容易出现冲突。这里展示两种方法:
其一是针对上边Android中实现下拉刷新的例子中的函数改写的。原代码是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000">
//将ListView改为包名.自定义的列表类名,MsgListView.java代码见后,此代码不需改通用,下拉刷新相关即此处,其他无关
<cn.xd.microblogging.tools.MsgListView
android:id="@android:id/list"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1.0"
android:drawSelectorOnTop="false"
android:scrollbars="vertical"
android:fadingEdgeLength="0dip"
android:divider="@drawable/line"
android:dividerHeight="3.0dip"
android:cacheColorHint="#00000000"
android:paddingBottom="40dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/msg_list_load"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<include
android:id="@android:id/empty"
layout="@layout/empty_loading"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
我的原baseAdapter的适配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="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="5dp" />
<TextView
android:id="@+id/msgname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="4dp"
android:textColor="#FFFFFFFF"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/msgtext"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:textColor="#FFFFFFFF"
android:textSize="22sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="left" >
<TextView
android:id="@+id/topic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginRight="10dp"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
<TextView
android:id="@+id/msgtime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_gravity="left"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
<TextView
android:id="@+id/msgaddr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginRight="10dp"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
<TextView
android:id="@+id/comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
改写后的是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000">
<com.wjy.message.MsgListView
android:id="@android:id/list"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1.0"
android:drawSelectorOnTop="false"
android:scrollbars="vertical"
android:fadingEdgeLength="0dip"
android:divider="@drawable/line"
android:dividerHeight="3.0dip"
android:cacheColorHint="#00000000"
android:paddingBottom="40dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/hehe">
<ImageView
android:id="@+id/img"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="5dp" />
<TextView
android:id="@+id/msgname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="4dp"
android:textColor="#FFFFFFFF"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/msgtext"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:textColor="#FFFFFFFF"
android:textSize="22sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="left" >
<TextView
android:id="@+id/topic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginRight="10dp"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
<TextView
android:id="@+id/msgtime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_gravity="left"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
<TextView
android:id="@+id/msgaddr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginRight="10dp"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
<TextView
android:id="@+id/comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:textColor="#FFFFFFFF"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
这其中加入了一个ImageView,一些textview的横横竖竖的布局。效果如图,
另一种是针对这个demo的PullToRefreshView这个托管在googlecode的资源非常完满的解决了很多问题,其中关于样式的xml有两个分别是:
grid_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:drawableTop="@drawable/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="test"/>
</LinearLayout>
其中就是放入了一个固定的图片和固定的文字
可以随意替换。另一个是
test_listview.xml
<?xml version="1.0" encoding="utf-8"?>
<com.miloisbadboy.view.PullToRefreshView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_pull_refresh_view"
android:background="@android:color/white"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<!– 这里放置listview,gridview或者scrollview的布局 ,PullToRefreshView
要设置android:orientation="vertical"属性
否则,显示不正确–>
<ListView
android:id="@android:id/list"
android:cacheColorHint="#00000000"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</com.miloisbadboy.view.PullToRefreshView>
这里和上边的一样都调用的私有的一个下拉刷新的头样式的view文件。这里都可以直接用。这个demo几乎不用改动xml,就是在Adapter适配器getView中
convertView = mInflater.inflate(R.layout.你的list样式名字, null);不同罢了。
最后一个问题是下拉刷新中list数据改变的情况。这里不能在额外的thread进行数据的更改,这样会异常。另外在非主线程调用Adapter的notifyDataSetChanged方法也会抱错。这里可以参考notifyDataSetChanged() 动态更新ListView的例子,两种方法:1利用Handler处理2利用AsyncTask异步处理。这里图鉴第二种,这里加载图片,加载大数据方面AsyncTask非常管用。 可以参考这里Android中AsyncTask的用法实例以及这个例子:异步下载图片。
这是最后的效果:
BaseAdapter使用好可以搭配出很多用户体验很好的列表,嵌入别的linerlayout也是很不错的。