注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

ListActivity和ListView  

2010-05-31 14:43:40|  分类: Android基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
ListActivity。这个类其实就是一个含有一个ListView组件的Activity类。
也就是说,如果我们直接在一个普通的Activity中自己加一个ListView也是完全可以取代这个ListActivity的,只是它更方便而已。
package com.teleca;
import java.util.List;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.ListView;
public class HelloList extends ListActivity{    
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);        
        List<String> items = fillArray();        
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.list_row,items);              
        this.setListAdapter(adapter);
    }
    private List<String> fillArray(){
        List<String> items = new ArrayList<String>();
        items.add("1");
        items.add("2");
        items.add("3");
        items.add("4");
        items.add("5");
        items.add("6");
        items.add("7");
        return items;
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {
        TextView txt = (TextView)this.findViewById(R.id.text);
        txt.setText("selected"+l.getSelectedItem().toString()+"!");
    }
}
注意:R.layout.list_row里面应该有个TextView

public ArrayAdapter (Context context, int textViewResourceId, List<T> objects)
Since: API Level 1
Constructor
Parameters
context     The current context.
textViewResourceId     The resource ID for a layout file containing a TextView to use when instantiating views.
objects     The objects to represent in the ListView.

public ArrayAdapter (Context context, int resource, int textViewResourceId, List<T> objects)
Since: API Level 1
Constructor
Parameters
context     The current context.
resource     The resource ID for a layout file containing a layout to use when instantiating views.
textViewResourceId     The id of the TextView within the layout resource to be populated
objects     The objects to represent in the ListView. 
的确可以简单到只需准备一个List对象并借助Adapter就可以构造出一个列表。
重载
onListItemClick()方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。
这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.main描述一下这个列表窗口。


<?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"
    >
<TextView id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""
    />
<ListView 
id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:drawSelectorOnTop="false"
    />
</LinearLayout>

这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。
然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。
再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个布局资源ID,如果文件只有一个控件的话,那么就不用指定控件的id,否则需要指定控件的id,
ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来控制列表项目的显示,

这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。
list_row.xml文件
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/item"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
注:
去掉项与项的横线
listView.setDividerHeight(0); 
this.getListView().setDivider(null);
这两个方法应该都可以,配合使用。
从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter。
先看看SimpleAdapter,说是simple却不简单哦。

public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

Since: API Level 1

Constructor

Parameters
contextThe context where the View associated with this SimpleAdapter is running
dataA List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in "from"
resourceResource identifier of a view layout that defines the views for this list item. The layout file should include at least those named views defined in "to"
fromA list of column names that will be added to the Map associated with each item.
toThe views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter.
首先看看这个fillMaps方法,基本上就明白这个simpleAdapter是怎么回事了,在有些场合它还是挺有用的,可以为每个条目绑定一个值:
private List<HashMap<String, String>> fillMaps()
    ...{
        List<HashMap<String, String>> items = new ArrayList<HashMap<String,String>>();
       
        HashMap<String,String> i = new HashMap<String,String>();
        i.put("name","日曜日");
        i.put("key", "SUN");
        items.add(i);
        HashMap<String,String> i1 = new HashMap<String,String>();
        i1.put("name","月曜日");
        i1.put("key", "MON");
        items.add(i1);
        HashMap<String,String> i2 = new HashMap<String,String>();
        i2.put("name","火曜日");  
        i2.put("key", "TUE");
        items.add(i2);
        HashMap<String,String> i3 = new HashMap<String,String>();
        i3.put("name","水曜日");
        i3.put("key", "WED");
        items.add(i3);
        HashMap<String,String> i4= new HashMap<String,String>();
        i4.put("name","木曜日");
        i4.put("key", "THU");
        items.add(i4);
        HashMap<String,String> i5 = new HashMap<String,String>();
        i5.put("name","金曜日");
        i5.put("key", "FRI");
        items.add(i5);
        HashMap<String,String> i6 = new HashMap<String,String>();
        i6.put("name","土曜日");
        i.put("key", "SAT");
        items.add(i6);

        return items;
    }

然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个控件ID的数组。我的代码是这样的:
//SimpleAdapter demo
List<HashMap<String, String>> items = fillMaps();
SimpleAdapter adapter=new SimpleAdapter(this,items,R.layout.list_row,new String[]...{"name"},new int[]...{R.id.item});

编译跑一下可以看到结果了,是吧?只是显示的文字不太对,再改一下:

protected void onListItemClick(ListView l, View v, int position, long id)
    ...{
        TextView txt = (TextView)this.findViewById(R.id.text);
        txt.setText("あすは "+((HashMap)l.obtainItem(position)).get("key").toString()+"です。");
    }

这样就好多了,其实一般情况下我们都是用ListView中的obtainItem取得当前选中的条目,然后转成List中的对应类型来使用的。

上面的例子中只显示name对应的值,其实你也可以试一下这样:

SimpleAdapter adapter=new SimpleAdapter(this,items,R.layout.list_row,new String[]...{"name","key"},new int[]...{R.id.item,R.id.item2});
看看是什么效果。

public SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to)

Since: API Level 1

This constructor is deprecated.
This option is discouraged, as it results in Cursor queries being performed on the application's UI thread and thus can cause poor responsiveness or even Application Not Responding errors. As an alternative, use LoaderManager with a CursorLoader.

Constructor the enables auto-requery.

public SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to, int flags)

Since: API Level 11

Standard constructor.

Parameters
contextThe context where the ListView associated with this SimpleListItemFactory is running
layoutresource identifier of a layout file that defines the views for this list item. The layout file should include at least those named views defined in "to"
cThe database cursor. Can be null if the cursor is not available yet.
fromA list of column names representing the data to bind to the UI. Can be null if the cursor is not available yet.
toThe views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter. Can be null if the cursor is not available yet.
flagsFlags used to determine the behavior of the adapter, as per CursorAdapter(Context, Cursor, int).
再看看那个CursorAdapter吧。它的列表中元素要求是Cursor,这东西与DB有关,不过最简单的DB就是通讯簿。先从Contacts.People入手吧,同样修改代码:
//CursorAdapter demo
Cursor mCursor = this.getContentResolver().query(Contacts.People.CONTENT_URI, null, null, null, null);
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.list_row,mCursor,new String[]...{Contacts.People.NAME},new int[]...{R.id.item});

因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。

现在的onListItemClick也不一样了,如下:

    protected void onListItemClick(ListView l, View v, int position, long id)
    ...{
        TextView txt = (TextView)this.findViewById(R.id.text);
        Cursor c = (Cursor)l.obtainItem(position);
        txt.setText("SEL = "+c.getString(c.getColumnIndex(Contacts.People.NUMBER)));
    }

这里同样是先用obtainItem取到游标,然后用从记录中取出想要的字段显示即可。在做这个例子时,因为权限的问题我们还得修改一下AndroidManifest.xml文件,让我们的应用可以访问到通讯簿:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.sharetop.android.hello.two">
    <uses-permission id="android.permission.READ_CONTACTS" />
    <application android:icon="@drawable/icon">
 ... ...

  评论这张
 
阅读(1936)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017