ListView

ListView

目录

ArrayAdapter

SimpleAdapter

SimpleCursorAdapter

ListView的使用是遵循MVC架构的

M:  模型层---用户要查看的内容-----数据源
V:  视图层---用户可以看到的界面---listview
C:  控制层---将M和V绑在一起-------adapter
  • 一般数据源都是用arraylist之类动态数组;

  • 至于ListView中的视图层则是用两个layout下的xml文件实现的

    其中一个(与activity绑定的)只需在布局文件中加入ListView节点;
    另一个则是用来进行ListView控件中的布局,该布局会在适配器中与数据源绑定

  • Adapter,根据ListView要实现的功能,适配器分为三类:ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。其中SimpleAdapter有最好的扩充性,有最好的使用效果;

ArrayAdapter 只能生成一行。而SimpleCursorAdapter则是simpleAdapter与数据库的结合,可以显示出数据库中内容。

ArrayAdapter
activity代码
package com.example.listview;
import android.app.Activity;
import android.os.Bundle;
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);
    ListView listview = (ListView) findViewById(R.id.lv);

    String[] cities = new String[]{"上海","北京","南京","武汉","东京"};

    ArrayAdapter myAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,cities);
    //simple_list_item_1是系统自带的一个list表单      
    listview.setAdapter(myAdapter);
    }
}
####layout代码
<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: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" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="城市" />

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

</LinearLayout>

SimpleAdapter详解:
  • activity:

    package com.example.listview;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListAdapter;
    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);
    ListView listview = (ListView) findViewById(R.id.lv);
    ArrayList<HashMap<String,Object>> arraylist = new ArrayList<HashMap<String,Object>>();
    
    HashMap<String,Object> map = new HashMap<String ,Object>();
    map.put("城市","北京");
    map.put("国家", "中国");
    map.put("照片",R.drawable.ic_launcher);
    arraylist.add(map);
    
    map = null;
    map = new HashMap<String , Object>();
    map.put("城市","冲绳");
    map.put("国家", "日本");
    map.put("照片",R.drawable.ic_launcher);
    arraylist.add(map);
    
    map=null;
    map = new HashMap<String , Object>();
    map.put("城市","首尔");
    map.put("国家", "韩国");
    map.put("照片",R.drawable.ic_launcher);
    arraylist.add(map);
    
    map=null;
    map = new HashMap<String , Object>();
    map.put("城市","平壤");
    map.put("国家", "朝鲜");
    map.put("照片",R.drawable.ic_launcher);
    arraylist.add(map);
    
    //生成适配器的Item和动态数组对应的元素  
    SimpleAdapter simpleAdapter = new SimpleAdapter(this, arraylist,//数据源 R.layout.listv, //Listv的XML实现
    //(*****)动态数组与ImageItem对应的子项 
            new String[]{"图片","国家","城市"}, 
            new int[]{R.id.iv_photo,R.id.tv_country,R.id.tv_city});
    //添加并且显示  
    listview.setAdapter(simpleAdapter);
    }
    

    }

  • activity

    <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: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" >
    
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="城市" />
    
    <ListView 
    android:id="@+id/lv"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"/>"
    
    </LinearLayout>
    
  • listv

    <?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:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/iv.photo"/>
    
    <LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_country"/>
    
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_city"/>
     </LinearLayout>
    

由代码可知,ListView的绑定使用步骤:

1.绑定layout里的listview组件

2.将要输入listview的数据,加入到生成的动态数组中

3.用adapter将动态数组与listview绑定(即上面说的定义了Listview组件布局的xml),各参数含义见上面代码

4.将该adapter添加并显示到页面布局:list.setAdapter(listItemAdapter);


SimpleCursorAdapter

由名字就知道,这是SimpleAdapter的一个增强型。再看cursor又能知道,这种增强是基于数据库的。

    package com.example.listview;


    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.provider.ContactsContract.PhoneLookup;
    import android.support.v4.widget.SimpleCursorAdapter;
    import android.widget.ListAdapter;
    import android.widget.ListView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView listview = (ListView) findViewById(R.id.lv);
    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query( ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
    if(cursor !=null){
        startManagingCursor(cursor);
    }

    ListAdapter listAdapter = new SimpleCursorAdapter(this, 
            android.R.layout.simple_list_item_1, cursor,
            new String[] { PhoneLookup.DISPLAY_NAME },
            new int[] { android.R.id.text1 });
    listview.setAdapter(listAdapter);
    stopManagingCursor(cursor);
    }

}

这只是简单的获取联系人姓名的例子而已,当然,为了能够运行该例子,我们需要添加下面的权限:

 <uses-permission android:name="android.permission.READ_CONTACTS" />

这里有一个方法很值得我们注意:startManagingCursor()。它的使用是基于这样的前提:游标结果集里有很多的数据记录,像是通讯录这样的结果集,肯定符合要求。使用该方法的目标主要是把获取的Cursor对象交给Activity管理,这样Cursor的生命周期就和Activity自动同步了,这样在Activity结束的时候就能自动结束Cursor的使用。使用前最好是先判断Cursor是否为空,以免发生错误,而且使用后也要用stopManagingCursor()方法来停掉它。

SimpleCursorAdapter除了数据来源指定是数据库之外,就和SimpleAdapter的用法几乎一样了。

ListView是Android中常用的控件,它可以展示一列数据,并且支持滑动、点击等交互操作。使用ListView需要自定义Adapter来管理数据和界面的显示。 以下是一个简单的ListView使用示例: 1. 定义ListView布局文件,例如listview_layout.xml: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 定义ListView的每一个item布局文件,例如list_item_layout.xml: ``` <TextView android:id="@+id/item_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:padding="16dp" /> ``` 3. 定义Adapter,例如MyAdapter.java: ``` public class MyAdapter extends BaseAdapter { private List<String> mDataList; public MyAdapter(List<String> dataList) { mDataList = dataList; } @Override public int getCount() { return mDataList.size(); } @Override public Object getItem(int position) { return mDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, false); holder = new ViewHolder(); holder.text = convertView.findViewById(R.id.item_text); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String data = mDataList.get(position); holder.text.setText(data); return convertView; } private static class ViewHolder { TextView text; } } ``` 4. 在Activity中使用ListView: ``` public class MainActivity extends AppCompatActivity { private ListView mListView; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); List<String> dataList = new ArrayList<>(); for (int i = 0; i < 20; i++) { dataList.add("Item " + i); } mAdapter = new MyAdapter(dataList); mListView.setAdapter(mAdapter); } } ``` 这样就完成了一个简单的ListView展示。当数据量较大时,可以使用RecyclerView来优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值