ListView以及Adapter的用法

AdapterView具有如下属性:
继承了ViewGroup
可以包括多个列表项,并将多个列表项以合适的形式显示出来。
显示多个列表项,由Adapter提供。调用AdapterView的setAdapter(Adapter)
方法设置Adapter即可。

ListView和ListActivity
ListView的实现第一种方式:继承Activity
1)在布局文件中配置ListView的属性。
android:entries=”@array/courses”:设置显示数组数据,
android:divider=”#ff0000”:设置每项的分割条
android:dividerHeight=”2dp”:设置分割条的高度
其添加setOnItemClickListener(OnItemClickListener)事件
setOnItemLongClickListener(OnItemLongClickListener)事件
总结:使用数组创建ListView十分简单。
但这种方式能定制的内容很少,数据不灵活。 甚至连每个列表项的字号大小,颜色都不能改变。如果想对ListView的外观,行为进行定制,需要把ListView作为AdapterView使用,通过Adapter控制每项的外观和行为。

2)Adapter是一个接口,为列表提供数据和格式
常见了Adapter有:
ArrayAdapter:简单,易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项
SimpleAdapter:并不简单,功能强大的Adapter,可以用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter相似,只是用于包装Cursor提供的数据
BaseAdapter:通常用于被扩展,可以对各列表项进行最大限度的定制

3)在布局文件中配置ListView使用ArrayAdapter为其添加显示数据、配置不同布局方式。
下面的布局都是Android系统自带的:android.R.layout
simple_list_item_1:每项显示一个内容时
simple_list_item_single_choice:带有单选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_SINGLE);
simple_list_item_multiple_choice:带有多选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
simple_list_item_checked:带有选择框的布局形式
也需要结合ListView中的setChoiceMode
总结:这种方式能够指定灵活的数据,但是界面比较单一,
每个列表项都是TextView组件。
也可以自定义布局文件,并且提供一个TextView组件.

4)SimpleAdapter,在布局文件中配置ListView
使用SimpleAdapter为其添加显示数据、实现自定义布局

SimpleAdapter(Context context, List<?extends Map<String, ?>> data, int resource, String[] from, int[] to)

第一个参数是Context,android上下文
第二个参数是List<? extends Map<String,?>>类型的集合对象,
该集合中每个Map<String,?>对象生成一个列表项
第三个参数是指定一个界面布局的ID。使用该界面作为列表项组件
第四个参数是一个String[]类型的参数,该参数决定提取Map<String,?>
对象中哪些key对应的value来生成列表项
第五个参数是一个int[]类型的参数,该参数决定填充哪些组件
总结:功能强大,可以实现更复杂的列表项。数据复杂。
但是只能显示本地图片,不能在线更新数据(如多个文件的下载进度)。

5)自定义Adapter适配器:extends BaseAdapter
BaseAdapter是所有适配器的基类
根据项目的情况提供自己需要的构造器

public MyAdapter(Context context,List<Map<String,Object>> list){
}

//返回ListView中要显示的子View数量
//只需要返回构造方法中的list的条目就可以了

@Override
public int getCount() {
    return this.list!=null?this.list.size():0;
}

//返回一个子View,即ListView中的一个子条目显示数据的对象。
//也可以自定义返回你想要的信息

public Object getItem(int position) {
    return this.list.get(position);
}

//根据ListView中的位置返回适配器的位置。

public long getItemId(int position) {
    return position;
}

//返回这个条目的整个信息

public View getView(int position, View convertView, ViewGroup parent)       
    return convertView;
}

6)ListView的实现另外一种方式:继承ListActivity
a)ListActivity默认布局中具有ListView,就可以不用指定布局文件。
然后调用setListAdapter为其指定适配器
也可以自定义布局方式,需要手动在布局文件中添加id为@android:id/list的ListView控件
b)然后调用setListAdapter为其指定适配器
android.R.layout.simple_list_item_2:显示两个文本框的布局
当ListView中的数据为空时,显示其他的组件,如下例:
指定该组件的id号为@android:id/empty

<TextView  android:id="@android:id/empty"
             android:layout_width="wrap_content"
        android:layout_height="wrap_content"
            android:text="No items."/>

第一种:ArrayAdapter

package com.xspacing.listview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

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.listview);

        final String array[] = { "遮天", "斗破苍穹", "完美世界", "大主宰" };
        listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array));
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "点击" + array[position], 0).show();
            }
        });

        listView.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "长按了" + array[position], 0).show();
                return true; // false长按不会消耗本次事件,会接着触发点击事件
            }
        });
    }
}
<RelativeLayout 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"
    tools:context="com.xspacing.listview.MainActivity" >

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

</RelativeLayout>

第二种:SimpleAdapter

package com.xspacing.listview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

    private int[] mImageIds;
    private String[] mNames;
    private String[] mDescs;
    private Map<String, Object> map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = (ListView) findViewById(R.id.listview);
        mImageIds = new int[] { R.drawable.a36, R.drawable.a37, R.drawable.a38, R.drawable.a39, R.drawable.a40 };
        mNames = new String[] { "张三", "李四", "王五", "老李", "老王" };
        mDescs = new String[] { "哈哈", "嘿嘿", "嘻嘻", "嘎嘎", "叽叽" };
        SimpleAdapter mSimpleAdapter = new SimpleAdapter(this, getDatas(), R.layout.item_list_view,
                new String[] { "mImageIds", "mNames", "mDescs" },
                new int[] { R.id.main_img, R.id.main_tv_name, R.id.main_tv_desc });
        listView.setAdapter(mSimpleAdapter);
    }

    public List<Map<String, Object>> getDatas() {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < mNames.length; i++) {
            map = new HashMap<String, Object>();
            map.put("mImageIds", mImageIds[i]);
            map.put("mNames", mNames[i]);
            map.put("mDescs", mDescs[i]);
            list.add(map);
        }
        return list;
    }

}

布局文件同上

第三种:BaseAdapter

package com.xspacing.slidelistview;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;

public class MainActivity extends Activity {

    private Context mContext;
    private ListView mListView;
    private MyBaseAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.main_list_view);
        mContext = this;
        final List<Student> list = new ArrayList<Student>();
        // 添加假数据
        for (int i = 0; i < 20; i++) {
            Student student = new Student();
            if (i % 2 == 0) {
                student.name = i + ".阳澄湖大闸蟹";
                student.desc = "9月23日正式开湖";
                student.reId = R.drawable.a25;
            } else {
                student.name = i + ".特大新闻";
                student.desc = "上海将举行xxx的演唱会";
                student.reId = R.drawable.a26;
            }
            list.add(student);
        }
        adapter = new MyBaseAdapter(list, mContext);
        mListView.setAdapter(adapter);
        mListView.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                list.remove(position);
                adapter.notifyDataSetChanged();
                return true;
            }
        });
        mListView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
        });
    }
}
package com.xspacing.slidelistview;

public class Student {

    public String name; //标题
    public int reId; //图片
    public String desc;//描述

    public Student(String name, String desc,int reId) {
        this.name = name;
        this.desc = desc;
        this.reId=reId;
    }
    public Student() {

    }

}
package com.xspacing.slidelistview;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;

public class MyBaseAdapter extends BaseAdapter implements ListAdapter {

    List<Student> list;
    Context mContext;

    public MyBaseAdapter(List<Student> list, Context mContext) {
        this.list = list;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        // 是否复用
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_view, parent, false);
            holder = new ViewHolder();
            holder.mImageView = (ImageView) convertView.findViewById(R.id.main_img);
            holder.mTextVieName = (TextView) convertView.findViewById(R.id.main_tv_name);
            holder.mTextDesc = (TextView) convertView.findViewById(R.id.main_tv_desc);
            // 设置tag
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.mImageView.setImageResource(list.get(position).reId);
        holder.mTextVieName.setText(list.get(position).name);
        holder.mTextDesc.setText(list.get(position).desc);
        return convertView;
    }

    class ViewHolder {
        ImageView mImageView;
        TextView mTextVieName;
        TextView mTextDesc;
    }

}
<RelativeLayout 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"
    tools:context="com.xspacing.slidelistview.MainActivity" >

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

</RelativeLayout>
<?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="80dp"
    android:layout_margin="10dp" 
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/main_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="5dp" >

        <TextView
            android:id="@+id/main_tv_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="第一个textview"
            android:textSize="17sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/main_tv_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:text="第二个textview" />
    </LinearLayout>

</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值