天天看點

ListView和ArrayAdapter、SimpleAdapter擴充卡的簡單使用

在Android開發中,ListView是一個非常常用的控件,當然,現在已經有RecycleView來替代它了,但ListView還是有不少人在使用的。用到ListView,就一定會用到擴充卡。那什麼是擴充卡呢?

擴充卡:是一個将資料(Data)  填充到 AdapterView(ListView就是一個典型的AdapterView)的中介,通過它能實作資料與AdapterView的分離設定,使AdapterView與資料的綁定更加簡便,修改更加友善。

一、使用ArrayAdapter填充ListView

步驟:

(1)定義一個數組來存放ListView中item的内容(資料源);

(2)通過實作ArrayAdapter的構造方法建立一個ArrayAdapter對象;

(3)、通過ListView的setAdapter(...)方法綁定ArrayAdapter。

首先是activity_main.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

    <ListView

        android:id="@+id/lv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" >

    </ListView>

</RelativeLayout>

然後是listview_item.xml

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

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

        <TextView 

        android:id="@+id/tv"

        android:layout_width="match_parent"

        android:textSize="18sp"

        android:layout_height="wrap_content"/>

</LinearLayout>

最後是MainActivity.java檔案

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.Toast;

public class MainActivity extends Activity {

private ListView lv;

String[] names={"張三","李四","王五","趙六","田七"};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lv=(ListView) findViewById(R.id.lv);

//1數組

//String[] names={"張三","李四","王五","趙六","田七"};

//2建立擴充卡

//ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.listview_item, R.id.tv, names);

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

//3填充

lv.setAdapter(adapter);

//4.ListView的監聽事件

lv.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

String item=(String) parent.getItemAtPosition(position);

//String item1= names[position];

Toast.makeText(MainActivity.this, "選擇是"+item, 0).show();

}

});

}

}

效果圖如下:

ListView和ArrayAdapter、SimpleAdapter擴充卡的簡單使用

二、使用SimpleAdapter實作文本且帶圖檔ListView

首先是activity_main.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

<ListView 

   android:id="@+id/lv"

   android:layout_width="match_parent"

   android:layout_height="match_parent"></ListView>

</RelativeLayout>

然後是listview_item.xml

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

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" >

    <ImageView

        android:id="@+id/img"

        android:layout_width="40dp"

        android:layout_height="40dp" />

    <TextView

        android:id="@+id/name"

        android:layout_width="0dp"

        android:layout_height="40dp"

        android:layout_weight="1"

        android:gravity="center_vertical"

        android:text="名字"

        android:textSize="18sp" />

</LinearLayout>

最後是MainActivity.java檔案

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.BaseAdapter;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.Toast;

public class MainActivity extends Activity {

private ListView lv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lv = (ListView) findViewById(R.id.lv);

// 1建立資料

List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();

HashMap<String, Object> map1 = new HashMap<String, Object>();

map1.put("name", "張三");

map1.put("image", R.drawable.ic_launcher);

HashMap<String, Object> map2 = new HashMap<String, Object>();

map2.put("name", "李四");

map2.put("image", R.drawable.sg);

HashMap<String, Object> map3 = new HashMap<String, Object>();

map3.put("name", "王五");

map3.put("image", R.drawable.mr);

list.add(map1);

list.add(map2);

list.add(map3);

// 2建立擴充卡

SimpleAdapter adapter = new SimpleAdapter(this, list,

R.layout.listview_item, new String[] { "name", "image" },

new int[] { R.id.name, R.id.img });

// 3 填充

lv.setAdapter(adapter);

// 4添加監聽

lv.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

HashMap<String, Object> map = (HashMap<String, Object>) parent

.getItemAtPosition(position);

Toast.makeText(MainActivity.this, "選擇是:"+map.get("name"), 0).show();

}

});

}

}

效果圖如下:

ListView和ArrayAdapter、SimpleAdapter擴充卡的簡單使用

三、自定義擴充卡

由于ArrayAdapter和SimpleAdapter是Android中已經提供的擴充卡,在使用上有一定的局限性,要實作比較複雜、靈活的控制,要使用自定義擴充卡

自定義擴充卡步驟

1、編寫一個類,繼承BaseAdapter

2、實作4個抽象方法

–getCount();

–getItem(intposition);

–getItemId(intposition);

–getVew();

首先是activity_main.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

    <ListView 

        android:id="@+id/lv"

        android:layout_width="match_parent"

        android:layout_height="match_parent"></ListView>

</RelativeLayout>

然後是listview_item.xml

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

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" >

    <ImageView

        android:id="@+id/img"

        android:layout_width="40dp"

        android:layout_height="40dp" />

    <TextView

        android:id="@+id/name"

        android:layout_width="0dp"

        android:layout_height="40dp"

        android:layout_weight="1"

        android:textSize="18sp"

        android:gravity="center_vertical"

        android:text="姓名" />

    <CheckBox 

        android:id="@+id/cb"

        android:layout_width="wrap_content"

        android:layout_height="40dp"

        android:focusable="false"

        android:clickable="false"/>

</LinearLayout>

其次是MyAdapter.java檔案

import java.util.HashMap;

import java.util.List;

import android.content.Context;

import android.graphics.Color;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

// 資料

List<HashMap<String, Object>> data;

Context context;

public MyAdapter(Context context,List<HashMap<String, Object>> data) {

// TODO Auto-generated constructor stub

this.context=context;

this.data=data;

}

// 1 傳回資料的個數

@Override

public int getCount() {

// TODO Auto-generated method stub

return data.size();

}

// 2擷取每一項内容

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return data.get(position);

}

// 3傳回資料的id(位置作為id)

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

//1 由布局檔案生成View對象

//1.1

// LayoutInflater inflater=LayoutInflater.from(context);

// inflater.inflate()

//1.2

View view=null;

TextView textView=null;

ImageView iv;

if(convertView!=null){//使用conertView來節省對象的建立,進而節省記憶體空間

view=convertView;

}else{

view=View.inflate(context, R.layout.listview_item, null);//父容器不要設定,有系統幫使用者填充到ListView

}

textView=(TextView) view.findViewById(R.id.name);//在布局檔案中查找子控件

iv=(ImageView) view.findViewById(R.id.img);

//擷取圖檔

Integer image=(Integer)(data.get(position).get("image"));

iv.setImageResource(image.intValue());

//設定文本框

String name=(String)(data.get(position).get("name"));

textView.setText(name);

textView.setTextColor(Color.GRAY);

return view;

}

}

最後是MainActivity.java檔案

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.CheckBox;

import android.widget.ListView;

import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

private ListView lv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

List<HashMap<String, Object>> names=new ArrayList<HashMap<String, Object>>();

HashMap<String, Object> map1=new HashMap<String, Object>();

map1.put("name", "張三");

map1.put("image",R.drawable.aa);

HashMap<String, Object> map2=new HashMap<String, Object>();

map2.put("name", "張三瘋");

map2.put("image",R.drawable.bb);

HashMap<String, Object> map3=new HashMap<String, Object>();

map3.put("name", "張三風");

map3.put("image",R.drawable.cc4);

HashMap<String, Object> map4=new HashMap<String, Object>();

map4.put("name", "張三豐");

map4.put("image",R.drawable.ic_launcher);

names.add(map1);

names.add(map2);

names.add(map3);

names.add(map4);

//

MyAdapter adapter=new MyAdapter(this, names);

lv.setAdapter(adapter);

//添加監聽

lv.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

CheckBox cb=(CheckBox) view.findViewById(R.id.cb);

// boolean b=cb.isChecked();

// if(b==true){

// cb.setChecked(false);

// }else{

// cb.setChecked(true);

// }

cb.setChecked(!cb.isChecked());

}

});

}

}

效果如下:

ListView和ArrayAdapter、SimpleAdapter擴充卡的簡單使用

這樣我就簡單的說完了ListView和擴充卡的簡單用法,下一節我将會說一下listview的優化。

demo下載下傳位址:http://download.csdn.net/detail/u014727709/9723650

轉載自:http://blog.csdn.net/u014727709/article/details/53909465

歡迎start,歡迎評論,歡迎指正

繼續閱讀