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();
}
});
}
}

效果圖如下:

二、使用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();
}
});
}
}

效果圖如下:

三、自定義適配器

由於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;
}
/**

 *4
* 返回值View 項目佈局 
* position位置
* convertView  view
* parent  要填充的控件
*/
@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和適配器的簡單用法,下一節我將會說一下listview的優化。

demo下載地址:http://download.csdn.net/detail/u014727709/9723650
轉載自:http://blog.csdn.net/u014727709/article/details/53909465

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章