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

     

  • 相关阅读:
    .net操作cookies
    sqlserver 自增列清零
    数据库之mysql视图、触发器、事务、存储过程、函数等相关内容-47
    知识补充之面向对象魔法方法及mysql等相关内容
    数据库之mysql多表查询(子查询)以及pymysql等相关内容-46
    数据库之mysql多表查询(连表)以及pymysql等相关内容-45
    数据库之mysql约束条件、表关系、记录操作等相关内容-44
    数据库之mysq修改表、表字段类型等相关内容-43
    数据库之mysql基础等相关内容-42
    并发编程之基于协程的高并发服务端、面向对象回顾等相关内容-41
  • 原文地址:https://www.cnblogs.com/smallkure/p/5282995.html
Copyright © 2011-2022 走看看