Android基础 学习之List 和 Adapter

本文介绍了Android中ListView的使用,包括在布局文件中添加ListView、继承ListActivity、使用SimpleAdapter和BaseAdapter的方式。详细讲解了如何创建适配器,设置点击事件,并提供了自定义视图和数据绑定的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基本的ListView
在布局文件添加ListView ,并在java代码中取出:

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

创建适配器并绑定

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arrayList);
lv_test.setAdapter(adapter);

参数:第一个:this –>上下文context。第二个:系统样式,可自定义 。第三个:数组数据
1.1点击事件

lv_test.setOnClickListener(new OnClickListener() {  
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub  
            }
        });

2.继承ListActivity
不需要再布局文件添加ListView,直接在Java部分继承

public class MyListViewActivity extends ListActivity {
}

创建适配器绑定适配器

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
setListAdapter(adapter);

参数:同上

3.使用SimpleAdapter
可以自定义视图
1)在主布局文件添加ListView并取出

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

2)建SimpleAdapter
视图(自定义视图)
这里写图片描述

java部分:

SimpleAdapter adapter = new SimpleAdapter(this, getData(),
                R.layout.simple_a_listviewrow, 
                new String[] {"img", "name", "info"}, 
                new int[] {R.id.iv_img, R.id.tv_name, R.id.tv_info});

方法说明

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

参数:第一个,上下文对象。第二个,具体数据。第三个,自定义视图(item项)。第四个,数据来源。第五个,绑定去向(绑定给谁)。

具体代码如下:

private List<? extends Map<String, ?>> getData() {
        Map<String, Object> map;
        array = new ArrayList<Map<String, Object>>();       
        for (int i = 0; i < 3; i++) {
            map = new HashMap<String, Object>();
            map.put("img", R.drawable.acorn);
            map.put("name", "Acorn");
            map.put("info", "这是一个有趣的图标");   
            array.add(map);
            map = new HashMap<String, Object>();
            map.put("img", R.drawable.gps);
            map.put("name", "GPS");
            map.put("info", "这是一个有趣的图标");   
            array.add(map);         
        }
        return array;
    }

最后还需要绑定适配器。

lv_simple_ada.setAdapter(adapter);

4.使用BaseAdapter
添加ListView和创建Item项跟SimpleAdapter一样,主要是适配器不同。
定义BaseAdapter:

BaseAdapter  adapter = new BaseAdapter() {
@Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder = null;
                viewHolder = new ViewHolder();//自定义类对象,用于存放数据,实现优化效果
                if (convertView == null) {//此处为了优化,如果第一次加载,则初始化
                    LayoutInflater inflater = LayoutInflater
                            .from(BaseAdapterActivity.this);//参数:上下文对象context
                    convertView = inflater.inflate(R.layout.base_adapter_listrow, parent, false);//参数:第一个,自定义视图(组件将从此获取)        
                    viewHolder.img = (ImageView) convertView.findViewById(R.id.iv_base_img);
                    viewHolder.name = (TextView) convertView.findViewById(R.id.tv_base_name);
                    viewHolder.info = (TextView) convertView.findViewById(R.id.tv_base_info);
                    convertView.setTag(viewHolder);
                } else {//如果非第一次加载则直接加载
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                //------------设置资源------------>>
                viewHolder.img.setImageResource(ids[position]);
                viewHolder.name.setText(names[position]);
                viewHolder.info.setText("这是一个有趣的图标");
                return convertView;
            }

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

            @Override
            public Object getItem(int position) {
                return names[position];
            }

            @Override
            public int getCount() {
                return names.length;
            }
        };

    private class ViewHolder {
        public ImageView img;
        public TextView name;
        public TextView info;   
    }

数据此处用简单的数组来装

String[] names = { "Acorn", "GPS", "Lossless_Decoder", "Minecraft","WinRAR", "YNAB" };
int[] ids = { R.drawable.acorn, R.drawable.gps,R.drawable.lossless_decoder, R.drawable.minecraft,R.drawable.winrar, R.drawable.ynab };

最后绑定适配器(此处与前面一样)。

要为Item项的元素添加点击等可以添加监听,如:

viewHolder.img.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

写在设置完资源之后。

要为Item项添加点击事件,在ListView上添加监听,如:

ListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                    Toast toast;
                if (toast == null) {
                    toast = Toast.makeText(ListViewRowEventActivity.this, "", 0);
                }
                toast.setText("你点了第" + position + "项");
                toast.show();
            }
        });

示例2:
自定义适配器
主布局文件中添加一个下拉选择控件

<Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

item项的布局文件,文件名:item_spinner.xml

<?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="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/iv_item"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_item"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="50dp"
        android:gravity="center"
        android:text="nihao" />

</LinearLayout>

定义一个bean文件,文件名:CountryBean.java

package com.example.customeadapter;

public class CountryBean {

    private int imageID; //图标id
    private String name; 

    public CountryBean(int imageID, String name) {
        super();
        this.imageID = imageID;
        this.name = name;
    }

    public int getImageID() {
        return imageID;
    }

    public void setImageID(int imageID) {
        this.imageID = imageID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

活动java代码

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner spinner = (Spinner) findViewById(R.id.spinner);

        //添加项
        CountryBean china = new CountryBean(R.drawable.ic_launcher, "中国");
        CountryBean usa = new CountryBean(R.drawable.ic_launcher, "美国");
        CountryBean korea = new CountryBean(R.drawable.ic_launcher, "韩国");
        CountryBean japan = new CountryBean(R.drawable.ic_launcher, "日本");

        //用数组存放
        ArrayList<CountryBean> list = new ArrayList<CountryBean>();
        list.add(china);
        list.add(usa);
        list.add(korea);
        list.add(japan);

        MyAdapter adapter = new MyAdapter(list, this);//定义并初始化自定义适配器,使用参数专递便于写成外部类

        spinner.setAdapter(adapter);//绑定适配器

    }

    //自定义适配器,继承自BaseAdapter
    class MyAdapter extends BaseAdapter {

        private ArrayList<CountryBean> list;
        private Context context;

        public MyAdapter(ArrayList<CountryBean> list, Context context) {
            super();
            this.list = list;
            this.context = context;
        }

        @Override//得到总长度
        public int getCount() {
            return list.size();
        }

        @Override//得到item项
        public CountryBean getItem(int position) {
            return list.get(position);
        }

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

        @Override//得到视图
        public View getView(int position, View convertView, ViewGroup parent) {
            //如果视图不存在,则创建
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.item_spinner, parent, false);//绑定视图和视图组
            }

            //得到视图中的控件
            ImageView iv = (ImageView) convertView.findViewById(R.id.iv_item);
            TextView tv = (TextView) convertView.findViewById(R.id.tv_item);

            CountryBean countryBean = list.get(position);//得到item项对象
            //设置资源
            iv.setImageResource(countryBean.getImageID());
            tv.setText(countryBean.getName());

            return convertView;//返回视图
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值