Focus on technology, enjoy life!—— QQ:804212028
浏览链接:http://blog.youkuaiyun.com/y18334702058/article/details/44624305
- 主题:用户界面之ListView(列表视图)
-ListView和TextView,Button等控件一样,一样的定义方式。但是Android开发中说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可以把列表中的数据映射到ListView中。
创建一个ListView需要3个元素
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
常用适配器
Adapter | 含义 |
---|---|
ArrayAdapter | 用来绑定一个数组,支持泛型操作 |
SimpleAdapter | 用来绑定在xml中定义的控件对应的数据 |
SimpleCursorAdapter | 用来绑定游标得到的数据 |
BaseAdapter | 通用的基础适配器 |
ListView结合ArrayAdapter适配器使用
activity_main.xml源代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
MainActivity.java源代码:
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;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
String[] str= new String[]{"aa","bb","cc","dd","ee"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, str);;
//上面android.R.layout.simple_list_item_1是系统自带的一种ListView布局方式
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "你点击的是"+arg2, Toast.LENGTH_LONG).show();
}
});
}
}
运行结果:
ListView结合SimpleAdapter适配器使用
难道我们只满足在列表中只展示几个文字吗?我们向更加漂亮点,我们想在列表中加入图片。这时候使用SimpleAdapter的时候到了。SimpleAdapter的使用也非常简单,同时它的功能也非常强大。可以通过它自定义ListView中的item(item就是列表每一行的显示)的内容,比如图片、多选框等。看一个例子,实现一个每一行都有一个ImageView和TextView的ListView。
activity_main.xml源代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
定义一个item的显示布局,也就是列表每一行怎么显示,来看源代码
item.xml源代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/ItemImage"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/ItemTitle"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textColor="#336699"
android:textSize="20sp"/>
<TextView
android:id="@+id/ItemText"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textColor="#336699"
android:layout_below="@+id/ItemTitle"/>
</RelativeLayout>
MainActivity.java源代码:
import java.util.ArrayList;
import java.util.HashMap;
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;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};
private String[] mListStr = { "aa","bb","cc","dd","ee" };
/*或者用这个,因为Map是个接口,HashMap是它的实现类
List<Map<String, Object>> listdata = new ArrayList<Map<String,Object>>();
for(int i=0; i<images.length; i++){
Map<String, Object> map = new HashMap<String, Object>();
map.put("myinfo", info[i]);
map.put("myimages", images[i]);
listdata.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, listdata, R.layout.list, new String[] {"myinfo", "myimages"} , new int[] {
R.id.myinfo, R.id.myimages });
lv.setAdapter(adapter);
*/
ArrayList<HashMap<String, Object>> itemData = new ArrayList<HashMap<String,Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
for(int i=0;i<mListTitle.length;i++){
HashMap<String,Object> item = new HashMap<String,Object>();
item.put("image", R.drawable.myimage);
item.put("title", mListTitle[i]);
item.put("text", mListStr[i]);
itemData.add(item);
}
SimpleAdapter adapter = new SimpleAdapter(this, itemData, R.layout.item, new String[] {"image"
,"title", "text"}, new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "你点击的是"+arg2, Toast.LENGTH_LONG).show();
}
});
}
}
运行结果:
ListView结合BaseAdapter适配器使用
其实开发中最常用的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView、GridView、Gallery、Spinner等。它是直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView。
activity_main.xml源代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
item.xml源代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/ItemImage"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/ItemTitle"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_toRightOf="@id/ItemImage"
android:textColor="#336699"
android:textSize="20sp"/>
<TextView
android:id="@+id/ItemText"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_toRightOf="@id/ItemImage"
android:textColor="#336699"
android:layout_below="@+id/ItemTitle"/>
<Button
android:id="@+id/ItemButton"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
MainActivity.java源代码:
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private ArrayList<HashMap<String, Object>> data;
private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};
private String[] mListStr = { "aa","bb","cc","dd","ee" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取将要绑定的数据设置到data中
data = getData();
listView = (ListView)findViewById(R.id.listView);
MyAdapter adapter = new MyAdapter(this);
listView.setAdapter(adapter);
}
private ArrayList<HashMap<String, Object>> getData(){
ArrayList<HashMap<String, Object>> itemDate = new ArrayList<HashMap<String,Object>>();
/**为动态数组添加数据*/
for(int i=0;i<mListTitle.length;i++){
HashMap<String,Object> item = new HashMap<String,Object>();
item.put("ItemImage", R.drawable.myimage);
item.put("ItemTitle", mListTitle[i]);
item.put("ItemText", mListStr[i]);
itemDate.add(item);
}
return itemDate;
}
private class MyAdapter extends BaseAdapter{
private LayoutInflater mInflater;
public MyAdapter(Context context){
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return getData().size();//返回列表的行数
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item, null);
holder.imageView = (ImageView)convertView.findViewById(R.id.ItemImage);
holder.title = (TextView)convertView.findViewById(R.id.ItemTitle);
holder.text = (TextView)convertView.findViewById(R.id.ItemText);
holder.bt = (Button)convertView.findViewById(R.id.ItemButton);
//将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
/**设置TextView显示的内容,即我们存放在动态数组中的数据*/
holder.title.setText((String)data.get(position).get("ItemTitle"));
holder.text.setText((String)data.get(position).get("ItemText"));
holder.imageView.setImageResource((Integer)data.get(position).get("ItemImage"));
/**为Button添加点击事件*/
holder.bt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(MainActivity.this, "你点击了---"+ position +"---按钮", Toast.LENGTH_LONG).show();
}
});
return convertView;
}
}
public final class ViewHolder{
public TextView title;
public TextView text;
public Button bt;
public ImageView imageView;
}
}
运行结果:
Focus on technology, enjoy life!—— QQ:804212028
浏览链接:http://blog.youkuaiyun.com/y18334702058/article/details/44624305