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

Android控件ListView

2016-04-23 22:28 453 查看

listview的使用

  ListView :用来在界面上显示数据列表。

ListView 原理

  MVC:

   Model  Person

   View   ListView
   Controle  Adapter 数据适配器

  使用listview显示数据列表的步骤:
1、在布局文件中添加一个listview控件
2、在代码中找到这个listview控件
3、创建一个数据适配器为listview填充数据

三种数据适配器

BaseAdapter

ListView lv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取ListView控件
lv = (ListView)findViewById(R.id.lv);
//设置适配器
lv.setAdapter(new MyListAdapter());
}

public class MyListAdapter extends BaseAdapter{

//返回要显示的总条目数量
public int getCount() {
// TODO Auto-generated method stub
return 600;
}
//返回该位置的条目对象
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}

//返回该位置的条目id
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView tv = null;
if(null == convertView)//没有旧的条目可用则创建新的条目
{
tv = new TextView(MainActivity.this);
System.out.println("convertview null" + position);
}
else {//有旧的条目被隐藏则重新使用旧的条目显示数据
tv = (TextView) convertView;
System.out.println("复用旧的" + position);
}

tv.setText("test"+position);
tv.setTextSize(50);

return tv;
}

}

ArrayAdapter

   使用ArrayAdapter为listview填充数据的步骤:

   1、在布局文件中添加ListView

   2、在代码中得到这个listview控件

   3、调用listview.setAdapter()填充数据

        //使用适配器为listview填充数据
//new ArrayAdapter:context 上下文,resourceId 条目布局文件的资源ID,object[] 要显示的数据
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item, new String[]{"王菲","谢霆锋","张柏芝","李亚鹏"}));

SimpleAdapter

    使用ArrayAdapter为listview填充数据的步骤:

   1、在布局文件中添加ListView

   2、在代码中初始化这个listview控件

   3、调用listview.setAdapter()填充数据

      
/**
* context 上下文
* data list 包含map
* resource item 布局文件
* from 就是我们map集合中存的key
* to item 布局中定义的控件的id
*
*/
List<Map<String, String>> data = new ArrayList<Map<String,String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("name", "张飞");
map1.put("phone", "138888");

Map<String, String> map2 = new HashMap<String, String>();
map2.put("name", "赵云");
map2.put("phone", "110");

Map<String, String> map3 = new HashMap<String, String>();
map3.put("name", "曹操");
map3.put("phone", "1900");

Map<String, String> map4 = new HashMap<String, String>();
map4.put("name", "貂蝉");
map4.put("phone", "114");

// 把map存到 list集合
data.add(map1);
data.add(map2);
data.add(map3);
data.add(map4);
//设置listview的数据适配器
lv.setAdapter(new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name","phone"}, new int[]{R.id.tv_name,R.id.tv_phone}));

条目的布局文件:
<?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:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_id"
/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_name"
/>
</LinearLayout>

复杂ListView条目的显示

步骤:

    1、在布局文件中添加ListView

    2、在代码中初始化这个listview控件
lv = (ListView) findViewById(R.id.lv);

    3、自定义数据适配器,继承了BaseAdapter,getView中我们不是简单的返回TextView,我们可以用布局文件来显示更复杂的条目

4、调用lv.setAdapter(new MyAdapter())填充数据

public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub

View v;
if (null == convertView) {
//用布局填充器从条目布局文件获取ListView条目显示的View
v = View.inflate(MainActivity.this, R.layout.lv_item, null);
}
else {
v = convertView;
}
//从条目布局中获取相应的控件
ImageView iv = (ImageView) v.findViewById(R.id.ivicon);
iv.setImageResource(R.drawable.ic_launcher);
TextView lv1 = (TextView) v.findViewById(R.id.tvtitle);
lv1.setText("标题"+position);
TextView lv2 = (TextView) v.findViewById(R.id.tvcontent);
lv2.setText("内容"+position);
return v;
}

条目布局文件lv_item
<?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" >

<ImageView
android:id="@+id/ivicon"
android:layout_width="70dp"
android:layout_height="70dp" />
<TextView
android:id="@+id/tvtitle"
android:layout_toRightOf="@id/ivicon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvcontent"
android:layout_marginTop="10dp"
android:layout_toRightOf="@id/ivicon"
android:layout_below="@id/tvtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>

</RelativeLayout>


其中,布局填充器的获得共有三种方式:这三种都可以,
//1种 写法 获取 布局填充器
//view = View.inflate(MainActivity.this, R.layout.item, null);

//2 种方法获取布局填充
//view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,null);
//3种写法  利用系统给我们提供的一个服务
LayoutInflater inflater =  (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.item, null);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ListView