在写论文的期间,一直忙忙碌碌的。在自己有些时间后,又觉得自己太无聊,浑浑噩噩的。于是,打算写些东西,帮助他人的同时,也算给自己复习下以前所学吧。鉴于android面试题,经常会被问到,android的listview的优化问题。于是,我打算把这部分整理下,由于listview较庞大,listview优化问题一下子讲解,可能人们听的会云里雾里的。所以打算把这个问题,listview优化问题,分成四部分来讲解。首先,最简单listview的创建和使用,其次是自定义适配器实现listview功能,然后是讲解listview的下拉刷新的实现,最后讲解listview的优化问题。
listview官方解释是A view that shows items in avertically scrolling list. 意思就是用来显示垂直滚动列表中的条目的视图。看看自己android手机的通讯录就知道什么意思了。每个联系人有个条目来显示。当然如果实现那样的效果,需用到三个元素。listview,adapter,data。接下来讲解下这三个的含义。
listview为显示列表数据的view,我们一般的做法是在布局文件中声明一个listview控件,然后在activity当中得到使用它。
adapter为适配器。用来把数据映射到视图列表中的。android为我们提供了三种适配器,ArrayAdapter,SimpleAdater,SimpleCursorAdapter。ArrayAdapter为数组适配器,只能展示一行文字。一般是把文字存储在String数组中,然后通过ArrayAdapter适配器进行匹配显示。
SimpleAdater为简单适配器,为我们平时使用最广的一种适配器。他的可扩展性很强,可以使用各种的布局。SimpleCursorAdapter适配器一般是与数据库配合来使用的,把数据库中的数据简单的显示在视图中。
data为数据,是显示在视图中的文字,图片等,这里我们一般是用一个链表来存储那些文字的数据。
对于上面三部分的内容我想用下面一张图来说明下。
图1
上图中的listview就是我们在布局文件中定义的listview控件,里面包含中很多条目,所以我们一般还是会再定义一个条目的布局文件来布局条目中显示的文字,图片等控件,条目中那些显示的数据就是上面我所说的data,而adapter在这里充当着,把那些要显示的数据和条目中的那些控件所一一对应起来。下面给出一个例子,这个例子是每行显示每个人的名字和号码的一个视图列表。
首先是main.xml添加一个listviw控件。
<?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"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listview"
/>
</LinearLayout>
然后在layout下list_item.xml条目文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:paddingRight="100dip"
android:textSize="30dip"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dip"
android:layout_toRightOf="@id/name"
android:layout_alignTop="@id/name"
android:paddingLeft="100dip"
android:id="@+id/telephone"
/>
</RelativeLayout>
然后再主Activity中加入如下代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
importandroid.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.ListView;
importandroid.widget.SimpleAdapter;
import android.widget.Toast;
public classListViewTestActivity extends Activity {
/** Called when the activity is firstcreated. */
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView>
//生成动态数组,加入数据
List<HashMap<String,Object>>>
for (int>
HashMap<String,Object>>
hashMap.put("name","csk");
hashMap.put("tel",110+i+"");
itemview.add(hashMap);
}
//生成适配器的Item和动态数组对应的元素
SimpleAdapter>
itemview,//数据data
R.layout.list_item,//list_item
newString[]{"name","tel"},//对于数组的相应项
newint[]{R.id.name,R.id.telephone}//知道和那个控件绑定数据
);
listView.setAdapter(sAdapter);//添加适配器并显示
listView.setOnItemClickListener(newOnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, Viewview,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "第"+(position+1)+"条数据", Toast.LENGTH_LONG).show();
}
});//添加响应事件
}
}
运行结果截图: