AndroidGUI18:ListView常用技巧

本文详细介绍了Android中ListView的使用,包括基本用法、自定义显示布局、自定义Adapter等,通过实例展示了如何在ListView中显示图片和文字,以及如何自定义显示每个条目的方式。还提及了ListActivity的简单应用。
摘要由CSDN通过智能技术生成

 

ListViewAdapterView的派生类,AdapterViewViewGroup的派生类。

 

 

ListView将需要显示的内容,放在一个可以垂直滚动的列表中进行显示。而要显示的内容是由和ListView相关联的ListAdapter指定的。通常是ArrayAdapter或者CursorAdapter,这两者都是ListAdapter的派生类。

 

因此ArrayAdapterCursorAdapter就是ListView的数据源。通常情况下,他们的主要区别是:

a.    ArrayAdapter用于指定数组中的数据,而CursorAdapter用于指定一个Cursor对象中的数据(比如从数据库中查询得到的结果)

b.    ArrayAdapter用于适合指定只有一列的数据,而CursorAdapter适合指定由多列的数据,但这点并不是很严格,也就是说ArrayAdapter也可以用于多列数据,CursorAdapter也可以用于显示单列数据。

 

下面我们用实际的例子来说明。

 

第一个例子:

最简单的ListView用法。

1.    创建一个AndroidProject,修改其main.xml,使之如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/linearlayout"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

 

         <!-- layout中增加一个ListView -->

         <ListView

                   android:id="@+id/listview"

                   android:layout_width="wrap_content"

                   android:layout_height="wrap_content"

         />

</LinearLayout>

 

2.    修改Activity所对应的代码,使之如下:

package com.pat.gui;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

 

public class ControlListView extends Activity

implements

OnItemClickListener

{

         // 声明一个ListView对象

         private ListView listview;

         // 定义一个String数组用以代表各种不同的手机操作系统

         private String os[] = { "Android", "iOS", "Windows Phone", "Symbian",

                                         "BlackBerry", "PalmOS", "OPhone", "Others..."};

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // 获得ListView对象

        listview = (ListView)this.findViewById(R.id.listview);

        // 定义一个ArrayAdapter对象ArrayAdapter有多个构造方法重载其中下面用到的构造方法原型为

        //public ArrayAdapter (Context context,int textViewResourceId, T[] objects)

        //context                                 The current context.

        //textViewResourceId          Theresource ID for a layout file containing a TextView to use

        //                                              wheninstantiating views.

        //objects                                 The objects to represent in theListView.

        ArrayAdapter<String>adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, os);

        // android.R.layout.simple_list_item_1Android预先定义好的我们自己也可以另外定义

       

        listview.setAdapter(adapter);                          // adapterlistview关联起来

       

        listview.setOnItemClickListener(this);       // listview设置OnItemClickListener

    }

   

         //@Override

         public void onItemClick(AdapterView<?> parent, View view, int position, long id)

         //       parent              The AdapterView where theclick happened.

         //       view                  The view within theAdapterView that was clicked (this will be a view provided by the adapter)

         //       position           Theposition of the view in the adapter.

         //       id                       The row id of theitem that was clicked.

         {

                   Toast.makeText(this,

                                     "/"" + ((TextView)view).getText().toString() +"/".  It's position is " + position,

                                     Toast.LENGTH_SHORT).show();

         }

}

 

运行结果如下:

上面的ListView可以上下滚动。

 

点击Symbian,则会出现:

 

 

第二个例子:

自定义显示ListView中每行的layout,同时显示图片和文字。

1.    res/layout中,创建一个用于显示ListView条目的layout文件:rowlayout.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="horizontal">

 

         <ImageView

                 android:id="@+id/row_icon"

                 android:layout_width="60px"

                android:layout_height="80px"

                android:src="@drawable/icon"

      />

      

       <TextView

                android:id="@+id/row_text"

                android:layout_width="wrap_content"

                android:layout_height="80px"

                android:textSize="30px"

                android:textColor="#0F0"

                android:gravity="center_vertical"

      />

</LinearLayout>

其中的ImageView用于显示图片,TextView用于显示文字。

 

2.    修改Activity所对应的代码,使之如下:

package com.pat.gui;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

 

public class ControlListView extends Activity

implements

OnItemClickListener

{

         // 声明一个ListView对象

         private ListView listview;

        

         // 定义一个代表手机操作系统的String数组

         String[] os =

         {

                   "Android",

                   "iOS",

                   "Windows Phone",

                   "Symbian",

                   "BlackBerry",

                   "PalmOS",

                   "OPhone",

                   "Other"

         };

        

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // 获得ListView对象

        listview = (ListView)this.findViewById(R.id.listview);

        // 定义一个ArrayAdapter对象ArrayAdapter有多个构造方法重载其中下面用到的构造方法原型为

        // public ArrayAdapter (Context context,int resource, int textViewResourceId, T[] objects)

        // context                                The current context.

        // resource                             The resource ID for a layoutfile containing a layout to use when instantiating views.

        // textViewResourceId          The id of the TextView within thelayout resource to be populated

        // objects                                The objects to represent in theListView.

        ArrayAdapter<String>adapter = new ArrayAdapter<String>(this, R.layout.rowlayout, R.id.row_text, os);

       

        listview.setAdapter(adapter);                          // adapterlistview关联起来

       

        listview.setOnItemClickListener(this);           // listview设置OnItemClickListener

    }

   

         //@Override

         public void onItemClick(AdapterView<?> parent, View view, int position, long id)

         // parent            The AdapterView where the click happened.

         // view                Theview within the AdapterView that was clicked (this will be a view provided bythe adapter)

         // position          The position of the view in the adapter.

         // id                     Therow id of the item that was clicked.

         {

                   // 此处接收到的view就是我们在rowlayout.xml中定义的LinearLayout

                   // 下面的语句用以获取其中的TextView(IDrow_text)

                   TextView tv =(TextView)view.findViewById(R.id.row_text);

                   Toast.makeText(this, "/"" + tv.getText().toString() + "/". It's position is " + position,

                                     Toast.LENGTH_SHORT).show();

         }

}

运行结果:


点击Android,得到:


在这个例子中,我们发现所有的图片都是一样的,要想图片和文字都不一样,请参考第三个例子。

 

 

第三个例子:

自定义Adapter,以控制如何显示ListView中的条目

1.    首先我们把各种手机操作系统的logo,拷贝到项目的res/drawable-mdpi


他们对应的文件名分别为:android.png,ios.png, wp.png, symbian.png, blackberry.png, palm.png, ophone.pngother.png

 

2.    修改strings.xml,使之如下:

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">Hello World, ControlListView!</string>

    <string name="app_name">AndroidGUI18</string>

    <string name="android">Android</string>

    <string name="ios">iOS</string>

    <string name="wp">Windows Phone</string>

    <string name="symbian">Symbian</string>

    <string name="palmos">PalmOS</string>

    <string name="blackberry">BlackBerry</string>

    <string name="ophone">OPhone</string>

    <string name="other">Other</string>

</resources>

定义了各种手机操作系统的名称

 

3.    修改Activity所对应的代码,使之如下:

package com.pat.gui;

 

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

 

public class ControlListView extends Activity

implements

OnItemClickListener

{

         // 声明一个ListView对象

         private ListView listview;

        

         // 定义一个图片资源ID数组代表各种手机操作系统的logo

         private int[] drawableIDs =

         {

                   R.drawable.android,

                   R.drawable.ios,

                   R.drawable.wp,

                   R.drawable.symbian,

                   R.drawable.blackberry,

                   R.drawable.palm,

                   R.drawable.ophone,

                  R.drawable.other

         };

        

         // 定义一个字符串ID数组用以代表各种不同的手机操作系统名称drawableIDs有一一对应的关系

         private int[] os =

         {

                   R.string.android

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值