您的位置:首页 > 移动开发 > Android开发

Android控件 – ListView的使用(一)– 使用Adapter绑定数据

2016-10-24 13:07 676 查看
ListView是Android最常使用的控件之一,要使用ListView要先了解适配器Adapter。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。Android中常用的几个Adapter有:

Adapter

含义

ArrayAdapter<T>

用来绑定一个数组,支持泛型操作

SimpleAdapter

用来绑定在xml中定义的控件对应的数据

BaseAdapter

通用的基础适配器

ListView使用ArrayAdapter

ArrayAdapter使用非常简单,它只要是实现简单的数组里对象的字符串到layout中预先定义的TextView控件上的数据绑定。

示例:

1、  在布局XML中添加一个ListView控件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>

2、  Activity代码:

public class MainActivity extends Activity {

private static final String[] strs = new String[] {
"一", "二", "三", "四", "五","六","七","八","九","十","十一","十二","十三","十四", "十五","十六","十七","十八","十九","二十","二十一","二十二","二十三"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strs));
}
}

说明:

ArrayAdapter的构造函数中第一个参数为context,第二个参数为包含TextView,其中也可以是自定义一个layout,但必须要有TextView,第三个参数就是ListView的内容。第二个参数可以使用android.R.layout.simple_list_item_checked或android.R.simple_list_item_single_choice资源,这样就可以实现带复选或单选的ListView,但是必须要用setChoiceMode()方法来设定多选还是单选,否则是无法选择的,如:lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);无论使用哪种资源,决定多选或单选是由setChoiceMode()方法来决定的。

ListView使用SimpleAdapter

有时候,我们除了要在ListView展示单调的文字外,还需要自定义一些内容,例如加入图片和多种文字等。这时就要使用SimpleAdapter了。SimpleAdapter可以通过它自定义item内容来实现一些灵活的布局

示例:

1、新建一个XML布局文件list_view_item.xml:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="50dp"
android:layout_width="match_parent">
<ImageView
android:id="@+id/item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/item_title"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:textSize="20sp"
android:gravity="center_vertical"/>
</LinearLayout>

2、修改Activity代码:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ListView lv = (ListView) findViewById(R.id.lv);
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
for(int i = 0; i < 10; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemIcon", R.mipmap.ic_launcher);
map.put("ItemText", "这是第" + i + "行");
listItem.add(map);
}
SimpleAdapter mSimpleAdapter = new SimpleAdapter(
this,
listItem,
R.layout.list_view_item,
new String[] {"ItemIcon", "ItemText"},
new int[] {R.id.item_icon,R.id.item_title}
);
lv.setAdapter(mSimpleAdapter);
}
}

说明:

 SimpleAdapter的构造函数中第一个参数为context,第二个参数接收一个Map数据源,本示例中使用了hashMap,将HashMap的每个键的数据映射到布局文件中对应控件上。

ListView使用BaseAdapter

虽然SimpleAdapter的自由度很高,但只能用于展示数据。如果想在每一个item里获得用户焦点和做一些处理用户的操作,例如item里包括按钮的使用。这时应该使用最灵活的适配器BaseAdapter。BaseAdapter它是一个抽象类,所以必须通过自定义一个继承类来实现,而且还要实现相应的一系列方法。

示例:

1、  修改list_view_item.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="50dp"
android:layout_width="match_parent">
<ImageView
android:id="@+id/item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/item_title"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:textSize="20sp"
android:gravity="center"
android:text="11111"/>
<Button
android:id="@+id/item_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_alignParentRight="true"/>
</RelativeLayout>

2、  新建类MyAdapter:

public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ArrayList<HashMap<String, Object>> mListItem;

public MyAdapter(Context context, ArrayList<HashMap<String, Object>> listItem) {
this.mInflater = LayoutInflater.from(context);
this.mListItem = listItem;
}

@Override
public int getCount() {
return mListItem.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_view_item, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.item_icon);
holder.title = (TextView) convertView.findViewById(R.id.item_title);
holder.btn = (Button) convertView.findViewById(R.id.item_btn);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
holder.title.setText(mListItem.get(position).get("ItemTitle").toString());
holder.btn.setText(mListItem.get(position).get("ItemBtnText").toString());
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
}
});
return convertView;
}

public static class ViewHolder {
public ImageView icon;
public TextView title;
public Button btn;
}
}

3、  修改Activity:

public class MainActivity extends Activity {
ArrayList<HashMap<String, Object>> mListItem;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mListItem = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 30; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemTitle", "第" + i + "行");
map.put("ItemBtnText", "第" + i + "个按钮");
mListItem.add(map);
}
ListView lv = (ListView) findViewById(R.id.lv);
MyAdapter mAdapter = new MyAdapter(this, mListItem);
lv.setAdapter(mAdapter);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐