• Android之自定义Adapter的ListView


    ListView的创建,一般要具备两大元素:

    1)数据集,即要映射的字符串、图片信息之类。

    2)适配器,实现把要映射的字符串、图片信息映射成视图(如Textview、Image等组件),再添加到ListView中。

    下面是一个实操例子:

    实现细节:

    1、创建数据集,一般定义如下

    private List<Map<String, Object>> listItems;

    元素添加方式:

    Map<String, Object> map = new HashMap<String, Object>(); 
            map.put("image", imgeIDs[i]);          //图片资源
            map.put("title", "物品名称:");           //物品标题
            map.put("info", goodsNames[i]);      //物品名称
            map.put("detail", goodsDetails[i]);   //物品详情
            listItems.add(map);                         //添加一项

    2、创建适配器

    public class ListViewAdapter extends BaseAdapter{........}  //自定义的适配器一般继承BaseAdapter类

            listViewAdapter = new ListViewAdapter(this, listItems);

    3、给ListView设置适配器

    listView.setAdapter(listViewAdapter);

    4、这里还有个关键点,如何把list_item.xml布局作为一个视图,添加到listView中:

            LayoutInflater listContainer;   //视图容器工厂

            listContainer = LayoutInflater.from(context); //创建视图容器工厂并设置上下文

            convertView = listContainer.inflate(R.layout.list_item, null);   //创建list_item.xml布局文件的视图

    ----------------------------------亲测有用-------------------------------

    1)布局文件main.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
    <!-- 结算 -->
    <LinearLayout Android:gravity="center_horizontal"
    Android:orientation="horizontal" android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <TextView Android:text="结算: "
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textColor="#FFFFFFFF"
    Android:textSize="20px"/>
    <ImageButton Android:id="@+id/imgbt_sum"
    Android:layout_width="40px"
    Android:layout_height="40px"
    Android:background = "@drawable/shopping" />
    </LinearLayout>
    <TextView Android:text="商品列表: "
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textColor="#FFFFFFFF" />
    <!-- 商品列表 -->
    <ListView Android:id="@+id/list_goods"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" />
    </LinearLayout>
    
    
    
    
    列表项布局文件list_item.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
    Android:orientation="horizontal" android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
    <!-- 商品图片 -->
    <ImageView Android:id="@+id/imageItem"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_margin="5px"/>
    <!-- 商品信息 -->
    <LinearLayout Android:orientation="vertical"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">
    <TextView Android:id="@+id/titleItem"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textColor="#FFFFFFFF"
    Android:textSize="13px" />
    <TextView Android:id="@+id/infoItem"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textColor="#FFFFFFFF"
    Android:textSize="22px" />
    </LinearLayout>
    <!-- 购买和商品详情 -->
    <LinearLayout Android:gravity="right"
    Android:orientation="horizontal" android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <CheckBox Android:id="@+id/checkItem"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_margin="5px"/>
    <Button Android:id="@+id/detailItem"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_margin="5px"/>
    </LinearLayout>
    </LinearLayout>
    2)代码,主代码:
    
    package com.myAndroid.test;  
    import java.util.ArrayList;  
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
    import Android.app.Activity;  
    import Android.app.AlertDialog;  
    import Android.content.DialogInterface;  
    import Android.os.Bundle;  
    import Android.view.View;  
    import Android.view.View.OnClickListener;  
    import Android.widget.ArrayAdapter;  
    import Android.widget.ImageButton;  
    import Android.widget.ListView;  
    public class MyListView extends Activity {  
    private ListView listView;  
    private ImageButton imgbt_sum;  
    private ListViewAdapter listViewAdapter;  
    private List<Map<String, Object>> listItems;  
    private Integer[] imgeIDs = {R.drawable.cake,   
                R.drawable.gift, R.drawable.letter,  
                R.drawable.love, R.drawable.mouse,  
                R.drawable.music};  
    private String[] goodsNames = {"蛋糕", "礼物",   
    "邮票", "爱心", "鼠标", "音乐CD"};  
    private String[] goodsDetails = {  
    "蛋糕:好好吃。",   
    "礼物:礼轻情重。",   
    "邮票:环游世界。",   
    "爱心:世界都有爱。",  
    "鼠标:反应敏捷。",  
    "音乐CD:酷我音乐。"};  
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            listView = (ListView)findViewById(R.id.list_goods);   
            imgbt_sum = (ImageButton) findViewById(R.id.imgbt_sum);  
            imgbt_sum.setOnClickListener(new ClickEvent());  
            listItems = getListItems();  
            listViewAdapter = new ListViewAdapter(this, listItems); //创建适配器
            listView.setAdapter(listViewAdapter);  
        }  
    /**
         * 初始化商品信息
         */
    private List<Map<String, Object>> getListItems() {  
            List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();  
    for(int i = 0; i < goodsNames.length; i++) {  
                Map<String, Object> map = new HashMap<String, Object>();   
                map.put("image", imgeIDs[i]);               //图片资源
                map.put("title", "物品名称:");              //物品标题
                map.put("info", goodsNames[i]);     //物品名称
                map.put("detail", goodsDetails[i]); //物品详情
                listItems.add(map);  
            }     
    return listItems;  
        }  
    class ClickEvent implements OnClickListener{  
    @Override
    public void onClick(View v) {  
    // TODO Auto-generated method stub
                String goodsList = "";  
    for(int i = 0; i < listItems.size(); i++) {  
                    goodsList += listViewAdapter.hasChecked(i)? goodsNames[i] + "  ": "";  
                }  
    new AlertDialog.Builder(MyListView.this)  
                .setTitle("购物清单:")  
                .setMessage("你好,你选择了如下商品:
    " + goodsList)  
                .setPositiveButton("确定", null)  
                .show();  
            }  
        }  
    }
     
    
     
    
     
    
    适配器代码:
    
    package com.myAndroid.test;  
    import java.util.List;  
    import java.util.Map;  
    import Android.app.AlertDialog;  
    import Android.content.Context;  
    import Android.util.Log;  
    import Android.view.LayoutInflater;  
    import Android.view.View;  
    import Android.view.ViewGroup;  
    import Android.widget.BaseAdapter;  
    import Android.widget.Button;  
    import Android.widget.CheckBox;  
    import Android.widget.CompoundButton;  
    import Android.widget.ImageView;  
    import Android.widget.ListView;  
    import Android.widget.TextView;  
    public class ListViewAdapter extends BaseAdapter {  
    private Context context;                        //运行上下文
    private List<Map<String, Object>> listItems;    //商品信息集合
    private LayoutInflater listContainer;           //视图容器
    private boolean[] hasChecked;                   //记录商品选中状态
    public final class ListItemView{                //自定义控件集合  
    public ImageView image;    
    public TextView title;    
    public TextView info;  
    public CheckBox check;  
    public Button detail;         
         }    
    public ListViewAdapter(Context context, List<Map<String, Object>> listItems) {  
    this.context = context;           
            listContainer = LayoutInflater.from(context);   //创建视图容器并设置上下文
    this.listItems = listItems;  
            hasChecked = new boolean[getCount()];  
        }  
    public int getCount() {  
    // TODO Auto-generated method stub
    return listItems.size();  
        }  
    public Object getItem(int arg0) {  
    // TODO Auto-generated method stub
    return null;  
        }  
    public long getItemId(int arg0) {  
    // TODO Auto-generated method stub
    return 0;  
        }  
    /**
         * 记录勾选了哪个物品
         * @param checkedID 选中的物品序号
         */
    private void checkedChange(int checkedID) {  
            hasChecked[checkedID] = !hasChecked[checkedID];  
        }  
    /**
         * 判断物品是否选择
         * @param checkedID 物品序号
         * @return 返回是否选中状态
         */
    public boolean hasChecked(int checkedID) {  
    return hasChecked[checkedID];  
        }  
    /**
         * 显示物品详情
         * @param clickID
         */
    private void showDetailInfo(int clickID) {  
    new AlertDialog.Builder(context)  
            .setTitle("物品详情:" + listItems.get(clickID).get("info"))  
            .setMessage(listItems.get(clickID).get("detail").toString())                
            .setPositiveButton("确定", null)  
            .show();  
        }  
    /**
         * ListView Item设置
         */
    public View getView(int position, View convertView, ViewGroup parent) {  
    // TODO Auto-generated method stub
            Log.e("method", "getView");  
    final int selectID = position;  
    //自定义视图
            ListItemView  listItemView = null;  
    if (convertView == null) {  
                listItemView = new ListItemView();   
    //获取list_item布局文件的视图
                convertView = listContainer.inflate(R.layout.list_item, null);  
    //获取控件对象
                listItemView.image = (ImageView)convertView.findViewById(R.id.imageItem);  
                listItemView.title = (TextView)convertView.findViewById(R.id.titleItem);  
                listItemView.info = (TextView)convertView.findViewById(R.id.infoItem);  
                listItemView.detail= (Button)convertView.findViewById(R.id.detailItem);  
                listItemView.check = (CheckBox)convertView.findViewById(R.id.checkItem);  
    //设置控件集到convertView
                convertView.setTag(listItemView);  
            }else {  
                listItemView = (ListItemView)convertView.getTag();  
            }  
    //      Log.e("image", (String) listItems.get(position).get("title"));  //测试
    //      Log.e("image", (String) listItems.get(position).get("info"));
    //设置文字和图片
            listItemView.image.setBackgroundResource((Integer) listItems.get(  
                    position).get("image"));  
            listItemView.title.setText((String) listItems.get(position)  
                    .get("title"));  
            listItemView.info.setText((String) listItems.get(position).get("info"));  
            listItemView.detail.setText("商品详情");  
    //注册按钮点击时间爱你
            listItemView.detail.setOnClickListener(new View.OnClickListener() {  
    @Override
    public void onClick(View v) {  
    //显示物品详情
                    showDetailInfo(selectID);  
                }  
            });  
    // 注册多选框状态事件处理
            listItemView.check  
                    .setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {  
    @Override
    public void onCheckedChanged(CompoundButton buttonView,  
    boolean isChecked) {  
    //记录物品选中状态
                            checkedChange(selectID);  
                        }  
            });  
    return convertView;  
        }  
    }

    原文链接:http://www.linuxidc.com/Linux/2011-05/35394.htm


    END
    ---------------------------------------------------------------------------------------------
    欢迎关注 我的微博@疯狂的迈步 我的github@junhey
  • 相关阅读:
    CentOS7 常用命令集合
    Microsoft Visual C++ 14.0 is required问题的解决或warning: Debugger speedups using cython not found
    microsoft visual c++与microsoft visual net 版本对应关系
    [Python爬虫] 之三十一:Selenium +phantomjs 利用 pyquery抓取消费主张信息
    Selenium support for PhantomJS has been deprecated, please use headless
    PyDev:warning: Debugger speedups using cython not foun
    文本相似性计算总结(余弦定理,simhash)及代码
    解决 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type的问题
    Java Web学习总结-文件下载
    jsp button提交表单
  • 原文地址:https://www.cnblogs.com/junhey/p/3456391.html
Copyright © 2020-2023  润新知