ListView

原创 2015年11月20日 22:44:35

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------ HorizontalListView

tag:HorizontalListView 横向listview  仿 优酷 播放列表 由于优酷的客户端很酷,最近在做视频列表的时候客户要求做出类似效果,开始打算用Gallery的,不过后来发...
  • copy_yuan
  • copy_yuan
  • 2016年04月28日 15:29
  • 2244

解决listview 嵌套listview

这几个文件是我从某位大神的简书上得来的,但是一时找不到这位仁兄,如果看到,请联系我,我将注明转载地址。 前段时间公司要开发一个软件产品,项目经理和我们的设计狮发过来一份UI,看到这份UI当时我的想...
  • a260724032
  • a260724032
  • 2017年02月03日 16:01
  • 1925

Android之——ListView优化

作为客户端,其最主要的任务就是最直观的和用户交互。从服务器拿数据,解析过后显示数据,根据用户操作按照一定的协议传回数据,达到用户想要的结果。这是我自己的理解,所以我们的程序,必须给用户一个良好的体验。...
  • l1028386804
  • l1028386804
  • 2015年08月02日 18:10
  • 2451

解析Android ListView工作原理及其缓存机制

这一篇对郭大神的《Android ListView工作原理完全解析,带你从源码的角度彻底理解》博客学习总结。...
  • Libmill
  • Libmill
  • 2015年11月04日 22:10
  • 4659

Django笔记 自定义ListView通用视图

资料https://ccbv.co.uk/projects/Django/1.4/django.views.generic.list/ListView/ http://stackoverflow....
  • SVALBARDKSY
  • SVALBARDKSY
  • 2016年02月19日 15:15
  • 1031

Android基础之ListView的使用详解

今天给大家带来《android应用开发全程实录》中关于listview和adatper中的部分。包括listview的基本使用,listview的优化等。 我们经常会在应用程序中使用列表的形式来展现...
  • u012960536
  • u012960536
  • 2015年07月02日 22:39
  • 14515

Android性能优化之提高ListView性能的技巧

ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能。...
  • nugongahou110
  • nugongahou110
  • 2015年07月29日 15:13
  • 13923

android listview去掉分割线

1》 设置android:divider="@null" 2》 android:divider="#00000000" #00000000后面两个零表示透明 3》 ...
  • cn2007
  • cn2007
  • 2014年04月02日 17:17
  • 87009

Listview动态添加/删除数据

这里是针对list的数据添加/删除方式,其他的数据方式相同。 布局很简单: ...
  • yueqinglkong
  • yueqinglkong
  • 2013年12月04日 23:18
  • 25724

动态刷新listview数据

之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶。 下面做了一...
  • kc58236582
  • kc58236582
  • 2015年11月30日 10:19
  • 2387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView
举报原因:
原因补充:

(最多只允许输入30个字)