zoukankan      html  css  js  c++  java
  • android开发之路08(ListView&Adapter)

    ListView控件介绍:用于将数据库中的数据或者网络中的数据通过列表的形式显示出来;ListView采用MVC模式将前端显示和后端数据进行分离。 也就是说,ListView控件在装载数据时并不是直接使用ListView.add或者类似的方法添加数据,而是需要指定一个Adapter对象。该对象相当于MVC模式中的C(控制器),ListView相当于MVC模式中的V(视图),用于显示数据。为ListView提供数据的List或数组相当于MVC模式中的M(模型)ListView控件中通过Adapter对象获得需要显示的数据,在创Adapter对象时需要指定要显示的数据(List或数组对象),因此,要显示的数据ListView之间通过Adapter对象进行连接,同时又互相独立,也就是说ListView只知道显示的数据来自Adapter,并不知道这些数据是来自List还是数组。

    1.ListView应用实例(这里是在java代码中操作listview对象的):

    public class MyListActivity extends ListActivity{

    //定义一个字符串数组,代表我们的数据源

    private  static final String[] COUNTRIES=new String[]{"中国","法国","美国","德国","日本","朝鲜","印度"};

     

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    //把我们需要展现的数据展现到ListView上

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item,COUNTRIES));

    //通过getListView()方法获取listview对象

    ListView lv=getListView();

    lv.setTextFilterEnabled(true);

    Log.e("MyListActivity", "listview界面产生了");

    lv.setOnItemClickListener(new OnItemClickListener() {

     

    @Override

    public void onItemClick(AdapterView<?> parent, View view,

    int position, long id) {

    //通过getText()方法获取用户选择的ListView中的选项信息

    Log.e("MyListActivity", "列表选项被点击了,看看会出现什么");

    Toast.makeText(getApplicationContext(), ((TextView)view).getText(), Toast.LENGTH_LONG).show();

    }

     

    });

    }

    }

    列表项xml文件如下:

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

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:padding="10dp"

        android:textSize="16sp">

    </TextView>

     

    Java代码①:

    public class MyActivity extends Activity{

    private ListView listview;

    private ArrayAdapter<String> adapter;

    //定义一个数据源

    private List<String> data=null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //获取数据源

    data=MyDataSource.getDataSource();

    adapter=new ArrayAdapter<String>(this, R.layout.list_item, data);

    listview=(ListView) findViewById(R.id.listview);

    //将数据源通过adapter显示到listview视图上

    listview.setAdapter(adapter);

     

     

    }

    }

    Java代码②:

     

    public class MyDataSource {

     

    public MyDataSource() {

    super();

    }

     

    public static List<String> getDataSource(){

    List<String> list=new ArrayList<String>();

    list.add("北京");

    list.add("上海");

    list.add("广州");

    list.add("湖北");

    list.add("湖南");

    list.add("深圳");

    list.add("西安");

     

    return list;

     

    }

     

    }

     

    布局文件activity_main.xml代码:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="match_parent">

     

        <ListView

            android:id="@+id/listview"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:text="@string/hello_world" />

     

    </RelativeLayout>

     

    列表项list_item.xml代码:

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

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:padding="10dp"

        android:textSize="16sp">

    </TextView>

     

    2.ListView应用实例:

    在上面的两个例子中我们用的都是ArrayAdapter(数组适配器),这个适配器显示的数据源比较单一;而SimpleAdapter能定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等; 

    下面我们就来看看如何使用SimpleAdapter

    MainActivity.java

    public class MainActivity extends Activity {

    private ListView mListView;

    private SimpleAdapter mSimpleAdapter=null;

    private List<Map<String, Object>> data=null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mListView=(ListView) findViewById(R.id.listview);

    data=new ArrayList<Map<String,Object>>();

    /**

     * setAdapter方法:

     * 第一个参数:是一个Context的对象;

     * 第二个参数:是一个集合,采用这样的形式List<Map<String, Object>>,为什么呢?

     * 这里的List<E>用来存储listview中的列表项,而List<E>集合中的每一个元素,又都有自己的特征

     * 因此我们通过用map集合代表list的元素的方式,完成了listview数据展示的多元化;

     * 第三个参数:是一个布局文件,用来展示listview的每个列表项的内容

     * 第四个参数:是我们List<Map<String, Object>>中Map<key,value>的key的数组表示;

     * 第五个参数:使我们List<Map<String, Object>>中Map<key,value>的value的数组表示;

     */

    Map<String, Object> mMap1=new HashMap<String, Object>();

    mMap1.put("title", "我是第一个功能");

    mMap1.put("icon", R.drawable.ic_launcher);

    Map<String, Object> mMap2=new HashMap<String, Object>();

    mMap2.put("title", "我是第二个功能");

    mMap2.put("icon", R.drawable.ic_launcher);

    Map<String, Object> mMap3=new HashMap<String, Object>();

    mMap3.put("title", "我是第三个功能");

    mMap3.put("icon", R.drawable.ic_launcher);

    data.add(mMap1);

    data.add(mMap2);

    data.add(mMap3);

    mListView.setAdapter(new SimpleAdapter(this, data, R.layout.list_item,

    new String[]{"title","icon"}, new int[]{R.id.tv,R.id.iv}));

    }

    }

     

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="match_parent">

     

        <ListView

            android:id="@+id/listview"

            android:layout_width="match_parent"

            android:layout_height="match_parent"/>

     

    </RelativeLayout>

    list_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="match_parent">

     

    <ImageView 

        android:id="@+id/iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

    <TextView 

        android:id="@+id/tv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

    </LinearLayout>

     

    3.自定义适配器:android界面中有时候需要显示稍微复杂的界面时,就需要我们自己定义一个adapter,那么就要继承BaseAdapter

     

  • 相关阅读:
    模板 无源汇上下界可行流 loj115
    ICPC2018JiaozuoE Resistors in Parallel 高精度 数论
    hdu 2255 奔小康赚大钱 最佳匹配 KM算法
    ICPC2018Beijing 现场赛D Frog and Portal 构造
    codeforce 1175E Minimal Segment Cover ST表 倍增思想
    ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解
    luogu P1966 火柴排队 树状数组 逆序对 离散化
    luogu P1970 花匠 贪心
    luogu P1967 货车运输 最大生成树 倍增LCA
    luogu P1315 观光公交 贪心
  • 原文地址:https://www.cnblogs.com/smallkure/p/5282995.html
Copyright © 2011-2022 走看看