Android之ListActivity

Android中的列表,当然也可以用ListView来完成所需要的功能,用法是一样的。

LiveActivity本身继承了关于List操作的众多接口,我们可以方便的重写这些操作中需要的方法来实现自己需要的功能。

如果要用ListActivity,则 ActivityLayout文件中必须包括一个(只能一个)ListView,且ListViewid= "@id/android:list"

如下代码,一个标准的ListActivity Layout文件:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent"
         android:paddingLeft="8dp"
         android:paddingRight="8dp">
 
     <ListView android:id="@id/android:list"
               android:layout_width="fill_parent" 
               android:layout_height="fill_parent"
               android:background="#00FF00"
               android:layout_weight="1"
               android:drawSelectorOnTop="false"/>
 
     <TextView id="@id/android:empty"
               android:layout_width="fill_parent" 
               android:layout_height="fill_parent"
               android:background="#FF0000"
               android:text="No data"/>
 </LinearLayout>

请注意 ListView 与TextView 的id 。前面说了,ListView 的Id 为固定不变的,为”@./idandroid:ost” ,ListActivity 会根据id 自动查找ListView 引用;但如果当ListView 中没有值而又想提示一句话时,那么用于指定显示提示信息的TextView 的id  必须为” "@id/android:empty" ,提示的信息可以通过android:text 进行指定。

OK,关于如何布局说完了,那么如何给List绑定值,并进行操作呢?

首先我们需要确实的是,ListView的布局也完成了,并通过调用setContentView(…)进行了绑定,但直到现在我们还没有确定ListView中的第一行显示的格式是什么,是直接显示文字还是要“图文并茂”的显示。

Android系统为我们提供了多种模板进行选择(android.R.layout),如

Ø Simple_list_item_1 每项有一个TextView

Ø Simple_list_item_2 每项有两个TextView

Ø Simple_list_item_checked CheckView的项

Ø Simple_list_item_multiple_choise 每项有一个TextView并可以多选

Ø Simple_list_item_single_choice 每项有一个TextView,但只能进行单选。

但然,如果以上项模板还无法满足你的要求,那只能自定义模板了(相当简单,就是定义一个layout布局)。如果你做的asp.net的开发的话,是否对dataList控件有印象呢。如果对DataList有印象,那么理解ListView也就相当的简单了。

自定义模板可以根据自己的需要定义成任意的格式,包括图片、方案及其他可显示的View,不用多说,自己定义就好了,关键是如果使用并进行模板的绑定。

如何要对ListView进行数据绑定,必须使用到一个接口:Adapter

其中最经常与ListView进行配合使用的有ArrayAdapterCursorAdapterSimpleAdapter等。

从名称可以看出ArrayAdapter使用的是一个ArrayAdapter做为数据源,SimpleCursorAdapter使用的是一个Cursor使用数据源,都比较容易理解,那么如何使用SimpleAdapter作为数据的适配器呢。Ok,从易到难。

ArrayAdapter:

String[] data = { "Item1", "Item2",

        "Item3", "Item4", "Item5" };

 listView.setAdapter(new ArrayAdapter<String>(this,

     android.R.layout.simple_list_item_single_choice, data));


SimpleCursorAdapter:

//从数据库中查询Cursor

   cursor = adapter.getAllNotes();

   startManagingCursor(cursor);

  

   //设置要显示的数据源中的列名(需要包含在cursor中)

   String[] from = new String[] { DiaryDbAdapter.KEY_COLUMN_TITLE,

                DiaryDbAdapter.KEY_COLUMN_CREATEED };

  

   //显示的View(自定义模板中的View)

   int[] to = new int[] { R.id.txtRowTitle, R.id.txtRowCreateed };

   //绑定

   SimpleCursorAdapter notes = new SimpleCursorAdapter(this,

                R.layout.diaryrow, cursor, from, to);

   setListAdapter(notes);


SimpleAdapter:

SimpleAdapter将一个List做为数据源,可以让ListView进行更加个性化的显示。而List中的第一项是个Map<String,?>(用到泛型),其中Map中的每项将与ListView中的每项进行一一对应绑定。Ok,看一下构造:

   SimpleAdapter(Context context,List<? Extends Map<String,?>> data,int resource,String [] form, int [] to);

 

² Context:当前上下文,一般把Activity.this传递进行。

² Data: 数据源。

² Resource: 自定义的layout模板资源,可以用 R.layout.xxx获取引用。

² Form: 定义ListView中的每一项数据索引,索引来自于Map<String,?>,即指定要显示的内容。

² To:View数组,在ListView模板中的定义View,Form中需要一一对应。

事例代码:

List<Hashtable<String, Object>> listContent = new ArrayList<Hashtable<String, Object>>();

      for (int i = 0; i < deviceList.size(); i++) {

         Hashtable<String, Object> table = new Hashtable<String, Object>();

         table.put("name", deviceList.get(i).Name);

         table.put("address", deviceList.get(i).Address);

         table.put("type", deviceList.get(i).Type + "");  

         listContent.add(table);

      }
      adapter = new SimpleAdapter(HeartActivity.this,

listContent, R.layout.child, //自定义的layout

 new String[] { "name", "address" },

 new int[] {R.id.txtDeviceName, R.id.txtDeviceAddress });
      setListAdapter(adapter);

以上代码使用了Hashtable做为一个Map,并添加到一个List<Hashtable<String, Object>>当中。

之后new一个SimpleAdapter,注意SimpleAdapter是如何生成的。



MoreActivity.java :

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
 
public class MoreActivity extends ListActivity {
 
private String discount_info;
private String recommend_shop;
private String about_us;
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.item,
new String[]{"title","info","img"},
new int[]{R.id.title,R.id.info,R.id.img});
setListAdapter(adapter);
 
}
 
private List<HashMap> getData() {
List<HashMap> list = new ArrayList<HashMap>();
 
Map map = new HashMap();
 
discount_info=this.getString(R.string.discount_info);//相应字符串在String.xml中设置
recommend_shop=this.getString(R.string.recommend_shop);
about_us=this.getString(R.string.about_us);
 
map.put("title", discount_info);
map.put("info", "android 1");
map.put("img", R.drawable.i1);
list.add(map);
 
map = new HashMap();
map.put("title", recommend_shop);
map.put("info", "android 2");
map.put("img", R.drawable.i2);
list.add(map);
 
map = new HashMap();
map.put("title", about_us);
map.put("info", "android 3");
map.put("img", R.drawable.i3);
list.add(map);
 
return list;
}
 
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if(0==id)
{
showInfo();//点击第一项执行函数,其它id可以自己设置执行函数
}
 
}
 
//定义启动Dialog
 
public void showInfo(){
new AlertDialog.Builder(this)
.setTitle("title")
.setMessage("bla..bla")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
 
}
}


item.xml:

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
 android:orientation=”horizontal”
 android:layout_width=”fill_parent”
 android:layout_height=”fill_parent”>
 <ImageView
  android:id=”@+id/img”
  android:layout_width=”wrap_content”
  android:layout_height=”wrap_content”
  android:layout_margin=”5px”/>
 
 <LinearLayout
  android:orientation=”vertical”
  android:layout_width=”wrap_content”
  android:layout_height=”wrap_content”>
 
  <TextView
   android:id=”@+id/title”
   android:layout_width=”wrap_content”
   android:layout_height=”wrap_content”
   android:textColor=”#000000″
   android:textSize=”22px” />
  <TextView
   android:id=”@+id/info”
   android:layout_width=”wrap_content”
   android:layout_height=”wrap_content”
   android:textColor=”#000000″
   android:textSize=”13px” />
 
 </LinearLayout>
</LinearLayout>




参考文章:

http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值