登录 立即注册
安币:

查看: 613534|回复: 26

安卓listview使用详解

[复制链接]

214

主题

489

帖子

21

安币

初级码农

版主

Rank: 1

QQ达人

QQ
发表于 2013-1-20 11:47:23 | 显示全部楼层 |阅读模式
android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
列表的显示需要三个元素:
1ListVeiw 用来展示列表的View
2.适配器  用来把数据映射到ListView上的中介。
3.数据    具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapterSimpleAdapterSimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
ArrayAdapter
                              
Mainactivity.java
    
package  com.example.listview;
  
  
import  java.util.ArrayList;
  
import  java.util.List;
  
  
import android.app.Activity;
  
import  android.os.Bundle;
  
import  android.view.Menu;
  
import  android.widget.ArrayAdapter;
  
import  android.widget.ListView;
  
  
public class MainActivity extends Activity {
  
  
         private  ListView listview;
  
         
  
    @Override
  
    public  void onCreate(Bundle  savedInstanceState) {
  
        super.onCreate(savedInstanceState);
  
      
  
        listview  = new ListView(this);
  
        listview.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getdata()));
  
                   setContentView(listview);
  
  
    }
  
  
    private  List getdata() {
  
                   List<String> data=new ArrayList<String>();
  
             data.add("中国");
  
             data.add("美国");
  
             data.add("法国");
  
             data.add("英国");
  
             data.add("俄罗斯");
  
                   return  data;
  
         }
  
  
         @Override
  
    public  boolean onCreateOptionsMenu(Menu  menu) {
  
        getMenuInflater().inflate(R.menu.activity_main, menu);
  
        return  true;
  
    }
  
}
  
ArrayAdapter(Context context,int textViewResourceId, List<T>objects)包含三个函数,(this,布局文件,数据源)
上面的代码中,ArrayAdapter(Context context,int textViewResourceId, List<T>objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。
SimpleCursorAdapter
简单的说就是方便把从游标得到的数据进行列表显示,并可以把指定的列映射到对应的TextView中。
下面的程序是从电话簿中把联系人显示到类表中。先在通讯录中添加一个联系人作为数据库的数据。然后获得一个指向数据库的Cursor并且定义一个布局文件(当然也可以使用系统自带的)。
由于模拟器里面没有通信录,所以显示为空。
实现代码:
Mainactivity.java
    
package  com.example.listview;
  
  
import  java.util.ArrayList;
  
import  java.util.List;
  
  
import  android.app.Activity;
  
import  android.database.Cursor;
  
import  android.os.Bundle;
  
import  android.provider.Contacts.People;
  
import  android.view.Menu;
  
import  android.widget.ArrayAdapter;
  
import  android.widget.ListAdapter;
  
import  android.widget.ListView;
  
import  android.widget.SimpleAdapter;
  
import  android.widget.SimpleCursorAdapter;
  
  
public class MainActivity extends Activity {
  
  
         private  ListView listview;
  
         
  
    @Override
  
    public  void onCreate(Bundle  savedInstanceState) {
  
        super.onCreate(savedInstanceState);
  
      
  
        listview  = new ListView(this);
  
        Cursor  cursor=getContentResolver().query(People.CONTENT_URI, null,  null, null,  null);
  
        startManagingCursor(cursor);
  
        ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1,
  
                                     cursor,new String[]{People.NAME}, new  int[]{android.R.id.text1});
  
                   listview.setAdapter(adapter);
  
                   setContentView(listview);
  
  
        
  
    }
  
  
   
  
  
         @Override
  
    public  boolean onCreateOptionsMenu(Menu  menu) {
  
        getMenuInflater().inflate(R.menu.activity_main, menu);
  
        return  true;
  
    }
  
}
  
Cursor cursor =getContentResolver().query(People.CONTENT_URI, null, null, null, null);先获得一个指向系统通讯录数据库的Cursor对象获得数据来源。
 startManagingCursor(cursor);我们将获得的Cursor对象交由Activity管理,这样Cursor的生命周期和Activity便能够自动同步,省去自己手动管理Cursor
 SimpleCursorAdapter 构造函数前面3个参数和ArrayAdapter是一样的,最后两个参数:一个包含数据库的列的String型数组,一个包含布局文件中对应组件idint型数组。其作用是自动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上。上面的代码,将NAME列的数据一次映射到布局文件的idtext1的组件上。
注意:需要在AndroidManifest.xml中如权限:<uses-permissionandroid:name="android.permission.READ_CONTACTS"></uses-permission>
给程序加权限
SimpleAdapter
simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivityListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。




接下来,再写一个在实际开发中常用到的listview
我们在实际开发中常常要以下功能:从数据库中读取数据,将信息显示出来
Main.xml
  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  
    xmlns:tools="http://schemas.android.com/tools"
  
    android:layout_width="match_parent"
  
    android:layout_height="match_parent"  
  
    android:orientation="vertical">
  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  
    xmlns:tools="http://schemas.android.com/tools"
  
    android:layout_width="match_parent"
  
    android:layout_height="wrap_content"  
  
    android:orientation="horizontal">
  
   
  
    <TextView
  
    android:id="@+id/pname"
  
    android:layout_width="wrap_content"
  
    android:layout_height="wrap_content"  
  
    android:layout_marginLeft="5dp"
  
    android:layout_weight="1"
  
    android:text="产品名称"
  
    />
  
   
  
     <TextView
  
    android:id="@+id/price"
  
    android:layout_width="wrap_content"
  
    android:layout_height="wrap_content"  
  
    android:layout_marginLeft="5dp"
  
    android:layout_weight="1"
  
    android:text="产品价格"
  
    />
  
     
  
      <TextView
  
    android:id="@+id/area"
  
    android:layout_width="wrap_content"
  
    android:layout_height="wrap_content"  
  
    android:layout_marginLeft="5dp"
  
    android:layout_weight="1"
  
    android:text="产品产地"
  
    />
  
    </LinearLayout>
  
   
  
  
   
  
    <ListView
  
        android:id="@+id/listview"
  
        android:layout_width="match_parent"
  
    android:layout_height="match_parent"  
  
        ></ListView>
  
   
  
  
</LinearLayout>
  
  [/td] [/tr]
mainActivity.java
  
package com.example.android_listview;
  
  
import java.util.List;
  
import java.util.Map;
  
  
import android.os.Bundle;
  
import android.app.Activity;
  
import android.view.Menu;
  
import android.view.MenuItem;
  
import android.widget.ListView;
  
import android.widget.SimpleAdapter;
  
import android.support.v4.app.NavUtils;
  
  
public class MainActivity extends  Activity {
  
private ListView listView;
  
private SimpleAdapter adapter;
  
private List<Map<String,  String>> data=null;
  
     @Override
  
     public void onCreate(Bundle savedInstanceState) {
  
         super.onCreate(savedInstanceState);
  
         setContentView(R.layout.activity_main);
  
         
  
         listView= (ListView)this.findViewById(R.id.listview);
  
         data=MyDataSource.getMaps();
  
         System.out.println(data+"data");
  
         adapter=new SimpleAdapter(MainActivity.this, data,  R.layout.activity_main, new  String[]{"pname","price","address"}, new  int[]{R.id.pname,R.id.price,R.id.area});
  
        listView.setAdapter(adapter);
  
     }
  
  
     @Override
  
     public boolean onCreateOptionsMenu(Menu menu) {
  
         getMenuInflater().inflate(R.menu.activity_main, menu);
  
         return true;
  
     }
  
  
     
  
}
  [/td] [/tr]
后台数据
DataSource.Java
  
package com.example.android_listview;
  
  
import java.util.ArrayList;
  
import java.util.HashMap;
  
import java.util.List;
  
import java.util.Map;
  
  
public class MyDataSource {
  
  
         public  MyDataSource() {
  
                   //  TODO Auto-generated constructor stub
  
         }
  
         
  
         public  static List<Map<String, String>> getMaps(){
  
                  
  
                   List<Map<String,  String>> listMaps=new ArrayList<Map<String,String>>();
  
                   Map<String,  String> map=new HashMap<String, String>();
  
                   map.put("pname",  "西瓜");
  
                   map.put("price",  "12.5");
  
                   map.put("address",  "新疆");
  
                  
  
                   Map<String,  String> map1=new HashMap<String, String>();
  
                   map1.put("pname",  "大米");
  
                   map1.put("price",  "12.5");
  
                   map1.put("address",  "湖南");
  
                  
  
                   Map<String,  String> map2=new HashMap<String, String>();
  
                   map2.put("pname",  "西瓜");
  
                   map2.put("price",  "12.5");
  
                   map2.put("address",  "新疆");
  
                  
  
                   listMaps.add(map1);
  
                   listMaps.add(map2);
  
                   listMaps.add(map);
  
                   return  listMaps;
  
                  
  
         }
  
}
  [/td] [/tr]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
做android开发牛人

1

主题

25

帖子

190

安币

程序猿

Rank: 2

发表于 2013-1-20 14:39:33 | 显示全部楼层
{:Skateboard:}

0

主题

536

帖子

674

安币

代码手工艺人

男爵

Rank: 4

QQ
发表于 2013-1-20 15:00:41 | 显示全部楼层
谢谢分享~~~~~~~
又是美好的一天,加油,骚年!

0

主题

520

帖子

2287

安币

Android大神

Rank: 6Rank: 6

发表于 2013-1-22 00:03:35 | 显示全部楼层

多謝分享

1

主题

19

帖子

6

安币

初级码农

Rank: 1

发表于 2013-2-4 17:20:00 | 显示全部楼层
请问 大米、西瓜 每行 下面感觉都有一行空白,如何让他没有空白啊

0

主题

104

帖子

1

安币

初级码农

Rank: 1

发表于 2013-2-13 11:15:43 来自手机 | 显示全部楼层
学习学习借鉴借鉴

3

主题

102

帖子

163

安币

程序猿

Rank: 2

QQ达人

发表于 2013-3-1 13:39:09 | 显示全部楼层
很不错下载下来学习学习

0

主题

26

帖子

6

安币

初级码农

Rank: 1

发表于 2013-3-11 13:56:32 | 显示全部楼层
{:Skateboard:}buxuo!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表