1.ArrayAdapter的使用:
(1)创建ListView的布局文件
<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"
tools:context="com.min.listadapter.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
(2)主函数直接调用
package com.min.listadapter;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 建字符数组
String[] data = new String[] { "one", "two", "three", "four", "five",
"six", "seven", "eight"
};
// 创建ArrayAdapter,第一个参数是上下文,第二个是资源,第三个字符数组
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, data);
// 为ListView 设置Adapter
ListView listView = (ListView) findViewById(R.id.lv);
listView.setAdapter(arrayAdapter);
// 设置单选
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// 事件监听
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
ActionBar actionBar = getActionBar();
actionBar.setTitle("YOU CLICK:" + arg2);
}
});
}
}
效果图:
2.SimpleAdapter的使用:
相比ArrayAdapter,SimpleAdapter可以自定义布局文件来显示ListView中的item
(1)listview的布局文件:activity_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"
tools:context="com.min.listview.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
(2)自定义的用于显示listview每项item的布局文件layout_simpleadapter.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="wrap_content"
android:orientation="horizontal" >
<ImageView
android:contentDescription="@string/picture"
android:id="@+id/iv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:orientation="vertical">
<TextView android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<TextView android:id="@+id/tv3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
(3)主函数:
package com.min.listview;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 建立HashMap数组,每个haspmap用来存放一张图片,3个string字符
ArrayList<HashMap<String, Object>> lists = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 20; i++) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("picture", R.drawable.ic_launcher);
hashMap.put("name", "NO." + i);
hashMap.put("say", "tell the number:" + i);
hashMap.put("mark", "over" + i);
lists.add(hashMap);
}
//
ListView listView = (ListView) findViewById(R.id.lv);
// 创建SimpleAdapter对象,参数:一个是上下文,第二个数据,第三个布局资源,第四个要查找内容对应的key值字符数组,第五个,要对应放入item布局文件对应的控件id集
SimpleAdapter simpleAdapter = new SimpleAdapter(this, lists,
R.layout.layout_simpleadapter, new String[] { "picture",
"name", "say", "mark" }, new int[] { R.id.iv, R.id.tv1,
R.id.tv2, R.id.tv3 });
// 为listview设置adapter
listView.setAdapter(simpleAdapter);
// 事件监听
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
ActionBar actionBar = getActionBar();
actionBar.setTitle("" + arg2);
}
});
}
}
效果图:
3.继承BaseAdapter的使用:
(1)在一个listview的item中,可以自己加入一些控件,并且能通过点击item上的控件得到响应,而上述2中adapter无法做到
(2)对数据读取方面有优化,资源消耗少,而上述2种adapter会将数据全部一下子读取到listview上,导致资源消耗大,listview滑动慢,而继承BaseAdapter的自定义adapter可以优化性能,适当读取数据到listview上
(1):定义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="com.min.baseadapter.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
(2)定义listview上item的布局文件样式layout_baseadapter.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/iv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:contentDescription="@string/icon" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_number"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/btn"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:textSize="12sp"
android:focusable="false"
android:width="0dp" />
</LinearLayout>
(3)继承BaseAdapter类MyAdapter.java:
提升Adapter的两种方法:
(1)重用缓存convertView传递给getView()方法来避免填充不必要的视图
(2)使用ViewHolder模式来避免没有必要的调用findViewById():因为太多的findViewById也会影响性能( ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构,这个数据结构包含了指向我们要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById())
package com.min.baseadapter;
import java.util.HashMap;
import java.util.List;
import android.app.ActionBar;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MyAdapter extends BaseAdapter {
//数据dataList;
private List<HashMap<String, Object>> dataList;
private LayoutInflater mLayoutInflater = null;
//构造函数
public MyAdapter(Context context, List<HashMap<String, Object>> dataList) {
this.dataList = dataList;
mLayoutInflater = LayoutInflater.from(context);
}
//重写的baseAdapter的函数getCount()
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataList.size();
}
//重写的baseAdapter的函数getItem()
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
//重写的baseAdapter的函数getItemId()
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//重写的baseAdapter的getView方法
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mLayoutInflater.inflate(R.layout.layout_baseadapter,
null);
holder.imageView = (ImageView) convertView.findViewById(R.id.iv);
holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
holder.tv_number = (TextView) convertView
.findViewById(R.id.tv_number);
holder.btn=(Button) convertView.findViewById(R.id.btn);
convertView.setTag(holder);
} else {
//将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
holder = (ViewHolder) convertView.getTag();
}
holder.imageView.setImageResource((Integer) dataList.get(position).get(
"img"));
holder.tv_name.setText((String) dataList.get(position).get("name"));
holder.tv_number.setText((String) dataList.get(position).get("number"));
holder.btn.setText("更多");
holder.btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("min","btn"+position);
}
});
return convertView;
}
//ViewHolder静态类
static class ViewHolder {
public ImageView imageView;
public TextView tv_name;
public TextView tv_number;
public Button btn;
}
}
主函数:
package com.min.baseadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
for (int i = 0; i <20; i++) {
HashMap<String,Object> hashMap=new HashMap<String, Object>();
hashMap.put("img",R.drawable.ic_launcher);
hashMap.put("name","name:"+i);
hashMap.put("number","number:"+i);
data.add(hashMap);
}
ListView listView=(ListView) findViewById(R.id.lv);
MyAdapter adapter=new MyAdapter(this, data);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
ActionBar actionBar=getActionBar();
actionBar.setTitle(""+arg2);
}
});
}
}
效果图:
补充:
在layout_baseadapter.xml中Button的属性一定要设置:android:focusable=”false”,否则会影响到ListView的item无法聚焦
——————————————————-end————————