您的位置:首页 > 其它

ListView实用指南

2015-10-18 09:49 295 查看
最近编码中遇到和ListView有关的问题,索性在干完活之后写一整个博客出来,一方面是分享给大家一起学习,二来是让自己理一理全部的思路.

ListView控件采用了MVC模式将前段显示和后端数据进行分离.也就是说ListView加载数据时不是简单的一个listview.add来添加,而是先加数据添加到控制器(Adapter),再将adapter中的数据添加到listview.ListView几乎用在了所有APP中,要显示大量有序数据的话ListView无疑是最好的选择.我将分为简单Listview实现,自定义ListView,ListView增删改操作的实现,ListView事件获取四个方面来介绍.

简单ListView实现

在操作ListView前,我们先要定义一个ListView控件.

<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>




在向ListView装载数据前需要定义一个adapter.


其中this来获取上下文对象,

android.R.layout.simple_list_item_1,用来指定ListView显示模板,一般来说我们会自定义一个模板,这里用的是AndroidSDK提供的模板,你可以在

<Android SDK安装目录>\platforms\android-\data\layout目录找到.

data是我们要显示的数据集,这里我定义了一个数据集data

private String[] data=new String[]{"第一行",
"第二行",
"第三行",
"第四行",
"第五行",
"第六行",
"第七行",
"第八行",
"第九行",
"第十行",
"第十一行",
"第十二行",
"第十三行",
"第十四行"};


ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,
R.layout.list_item,data);
listView.setAdapter(adapter);


运行之后就可以显示了.要在加载时九选定某一行,可以添加如下代码,这样就默认选中第12行.

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
listView.setSelection(12);




自定义ListView模板的实现

很多时候由于SDK提供的模板不足以满足我们的要求,我们需要自定义模板,来完成我们自己的数据显示.比如说我需要实现如下界面



这时候我们就需要定义自己的模板.在layout下新建资源文件list_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="64dp">
<RelativeLayout
android:layout_weight="3"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_marginLeft="10dp"
android:layout_centerVertical="true"            android:orientation="vertical"
android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/remarkInList" android:focusable="true" android:textSize="22dp" android:textStyle="bold" android:singleLine="true" android:layout_width="wrap_content" android:layout_height="match_parent" /> <TextView android:id="@+id/dateInList" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout> <LinearLayout android:layout_marginRight="10dp" android:layout_weight="4" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text=" ¥ " android:textSize="30dp" android:layout_gravity="center_horizontal|center_vertical" android:gravity="center_vertical|center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/spendMoneyInList" android:layout_width="wrap_content" android:layout_height="match_parent" android:textSize="30dp" android:textStyle="bold" android:singleLine="true" android:focusable="true" android:layout_gravity="center_horizontal|center_vertical" android:gravity="center_vertical|center_horizontal" /> </LinearLayout></LinearLayout>
在代码中定义好要显示的数据集后,在代码中实现

List<Map<String,String>> list=new ArrayList<>();//保存list数据
for (int x=0;x<data.length;x++){
Map<String,String>map=new HashMap<>();//定义map集合
map.put("data",data[x]);
map.put("date",date[x]);
map.put("text",text[x]);
list.add(map);//增加数据
}
SimpleAdapter simpleAdapter=new SimpleAdapter(this,//实例化Simpleadapter
list,//要包装的数据集和
R.layout.list_item,//模板
new String[]{"data","date","text"},//定义要显示的map的key
new int[]{R.id.remarkInList,R.id.dateInList,R.id.spendMoneyInList}//用来显示的id
);

listView.setAdapter(simpleAdapter);//设置显示数据

这样我们九完成看自定义模板的显示



ListView中的增删改操作的实现

我们用listview的目标肯定不止于此,更多的时候我们需要动态的来添加,删除,修改listview中的内容.这样的话我们就需要自定义一个数据集和adapter来操作了.

public class myListViewAdapterDates {
String remark,money,date,unixTime;

public String getUnixTime() {
return unixTime;
}

public void setUnixTime(String unixTime) {
this.unixTime = unixTime;
}

public String getMoney() {
return money;
}

public void setMoney(String money) {
this.money = money;
}

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public String getRemark() {
return remark;
}

public void setRemark(String remark) {
this.remark = remark;
}

public myListViewAdapterDates() {
}

public myListViewAdapterDates(String remark, String date, String money) {
this.remark = remark;
this.date = date;
this.money = money;
this.date = date;
}
}


public class myListViewAdapter extends BaseAdapter {
private Context context;
private List<myListViewAdapterDates> datas = new ArrayList<myListViewAdapterDates>();//定义要显示的list集合

public myListViewAdapter(Context context,List<myListViewAdapterDates> datas) {
this.context = context;
this.datas=datas;
}

@Override
public int getCount() {
if (datas == null)
return 0;
return datas.size();
}

@Override
public Object getItem(int position) {
return datas.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = View.inflate(context, R.layout.list_item,null);

myListViewAdapterDates entity = datas.get(position);//从list集合中取出数据并现实到页面中
((TextView) convertView.findViewById(R.id.remarkInList)).setText(entity.getRemark());
((TextView)convertView.findViewById(R.id.dateInList)).setText(entity.getDate());
((TextView)convertView.findViewById(R.id.spendMoneyInList)).setText(entity.getMoney());
return convertView;
}
/** 移除item数据 */
public void delData(int position) {
if (datas != null && datas.size() > 0)
datas.remove(position);// 移除指定数据
}
public void removeAll(){
datas.clear();
}
}

接下来我们在代码中实现listview与adapter的绑定.与增删改的实现.

public class Activity2 extends Activity {

private myListViewAdapter adapter;
private ListView listView;
private List<myListViewAdapterDates> Arrays = new ArrayList<>();
private static int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView= (ListView) findViewById(R.id.listview);
adapter=new myListViewAdapter(this,Arrays);//绑定adapter与数据集
listView.setAdapter(adapter);
}
public void add(int position,String remark, String money, String date){//增加列表项到指定位置
myListViewAdapterDates dates=new myListViewAdapterDates();
dates.setDate(date);
dates.setRemark(remark);
dates.setMoney(money);
Arrays.add(position,dates);//增加列表项到指定位置  0代表最顶端
adapter.notifyDataSetChanged();
count++;
}
public  void modify(int position,String remark, String money, String date){//修改指定列表项内容
/**
* 我们可以先删掉指定项内容,然后在次进行修改
* ***/
del(position);
add(position,remark, money, date);
}
public void del(int position){//删除指定列表项

adapter.delData(position);
adapter.notifyDataSetChanged();
if (count > 0)
count--;
}
public void delAll(){//删除所有列表项
adapter.removeAll();
adapter.notifyDataSetChanged();
}
}


ListView事件获取

我们可以通过listview的OnItemClickListener,OnItemSelectedListener,OnItemLongClickListener来完成对listview事件的获取.

listView.setOnItemClickListener(new OnItemClickListener1());//列表项点击事件
listView.setOnItemSelectedListener(new OnItemSelectedListener1());//列表项选择事件
listView.setOnItemLongClickListener(new ItemLongClickListener1());//列表项长按事件


private class OnItemClickListener1 implements android.widget.AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//列表项点击后处理
}
}

private class OnItemSelectedListener1 implements AdapterView.OnItemSelectedListener {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//列表项选择后处理
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
//列表项无选择处理
}
}

private class ItemLongClickListener1 implements AdapterView.OnItemLongClickListener {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//列表项长按处理
return false;
}
}


本文到此结束,demo我稍后上传,欢迎大家指出文中不足之处,共同进步.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: