巧秒构造造就强大的adapter

上一篇文章介绍了对adapter的简单认识,通过这一段时间的学习深刻认识到了adapter的强大。这篇文章将介绍一下如何巧妙地定义自己的构造函数来满足各种各样的adapter需要,同时也是对之前ListView结合Adapter逗比用例的进一步完善,希望能对大家对适配器的理解有一定的帮助!

上一个实例中将拿到的实体对象转换成一个个实体属性的数组之后才放入适配器中,总感觉这是很笨拙的方式,当时心中只有一个想法:任何一种封装都不会做成这样的,这样的局限性太强了。于是在网上找各种资料,终于解决了自己心中的疑惑,现拿改版后的代码和大家分享!

改版前:

<span style="font-size: 18px;"> </span><span style="font-size:14px;">/*子线程-解析数据*/
     private  Handler handler = new Handler() {
         /*声明子类中商品数量*/
         public List<sonSortigns> sortingSon;  

        private String[] ListproName = {};  

          // 在Handler中获取消息,重写handleMessage()方法
          @Override
          public void handleMessage(Message msg) {  

              switch (msg.what) {
                case -1:
                    Toast.makeText(SearchActivity.this, "服务器连接失败!",
                            Toast.LENGTH_SHORT).show();
                    break;
                case -2:
                    Toast.makeText(SearchActivity.this, "哎呀,出错啦...",
                            Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    String temp = (String)msg.obj;
                    //将拿到的json转换为数组
                    List<productSonSorting_cate> sortingInfo = JSON.parseArray(temp,productSonSorting_cate.class);  

                    //小吃类商品个数
                    LengthsortingSon=sortingInfo.get(0).getSonSortings().get(0).getProducts().size();  

                    /*循环各个商品属性加入数组*/
                    for(int i=0;i<LengthsortingSon;i++){  

                        mTitleValues[i] =sortingInfo.get(0).getSonSortings().get(0).getProducts().get(i).getProName().toString();
                        mContentValues[i] =sortingInfo.get(0).getSonSortings().get(0).getProducts().get(i).getMarkPrice().toString();
                        mEvluateValues[i]=sortingInfo.get(0).getSonSortings().get(0).getProducts().get(i).getHaoping().toString();
                        mSellValues[i]=sortingInfo.get(0).getSonSortings().get(0).getProducts().get(i).getAreadSell().toString();
                    }  

                    /*适配商品属性和控件*/
                    product_class_listview.setAdapter(new productsAdapter());
                    break;
                default:
                    break;
              }
          }
     }; </span>

改版后:

<span style="font-size:14px;">/*子线程-解析数据*/
     private  Handler handler = new Handler() {
         /*声明子类中商品数量*/
         public List<sonSortigns> sortingSon;

        private String[] ListproName = {};

          // 在Handler中获取消息,重写handleMessage()方法
          @Override
          public void handleMessage(Message msg) {

              switch (msg.what) {
                case -1:
                    Toast.makeText(SearchActivity.this, "服务器连接失败!",
                            Toast.LENGTH_SHORT).show();
                    break;
                case -2:
                    Toast.makeText(SearchActivity.this, "哎呀,出错啦...",
                            Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    String temp = (String)msg.obj;
                    //将拿到的json转换为数组
                    List<productSonSorting_cate> sortingInfo = JSON.parseArray(temp,productSonSorting_cate.class);
                    // listview加载适配器
                    product_class_listview.setAdapter(new ProductsListAdapter(SearchActivity.this,sortingInfo));
                    break;

                default:
                    break;
              }
          }
     };</span>

这里用到的ProductListAdapter()具体内容为:

<span style="font-size:14px;">package jczb.shoping.adapter;

import java.util.List;

import jczb.shoping.adapter.MainLVGrideViewAdapter.mainProList;
import jczb.shoping.model.productSonSorting_cate;
import jczb.shoping.model.products;
import jczb.shoping.model.sonSortigns;
import jczb.shoping.ui.ProductsInfoActivity;
import jczb.shoping.ui.R;
import jczb.shoping.ui.SearchActivity;
import jczb.shoping.ui.SearchActivity.ViewHolder;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/*适配器-适配数据&控件*/
public class ProductsListAdapter extends BaseAdapter{

    private Context mContext;
    private List<productSonSorting_cate> mList;

    public ProductsListAdapter(Context mContext,List<productSonSorting_cate> mList) {
        super();
        this.mContext = mContext;
        this.mList = mList;
        }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        if (mList==null) {
            return 0;
        }else {
            //返回数组长度、同时也是最终列表中item的个数
            return this.mList.get(0).getSonSortings().get(0).getProducts().size();
        }
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        if (mList == null) {
            return null;
        } else {
            //绑定数组
            return this.mList.get(position);
        }
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(this.mContext).inflate(R.layout.activity_search_item, null,true);
            //绑定控件
            holder.image=(ImageView) convertView.findViewById(R.id.search_image);
            holder.title=(TextView) convertView.findViewById(R.id.search_item_title);
            holder.content=(TextView) convertView.findViewById(R.id.search_item_value);
            holder.evaluate=(TextView) convertView.findViewById(R.id.search_item_evaluate);
            holder.sell=(TextView) convertView.findViewById(R.id.search_item_sell);
            holder.search_layout=(LinearLayout) convertView.findViewById(R.id.search_layout);

            //缓存列表,供下次使用
            convertView.setTag(holder); 

        } else {
            holder = (ViewHolder) convertView.getTag();
        } 

        if (this.mList != null) {
            //控件绑定数据
            sonSortigns mProductsList = this.mList.get(0).getSonSortings().get(position);
            holder.title.setText(mProductsList.getProducts().get(position).getProName());
            holder.content.setText(mProductsList.getProducts().get(position).getShopPrice());
            holder.evaluate.setText(mProductsList.getProducts().get(position).getHaoping());
            holder.sell.setText(mProductsList.getProducts().get(position).getAreadSell());          

        }
        return convertView;
}

    /*定义item对象*/
    public class ViewHolder {
        LinearLayout search_layout;
        ImageView image;
        TextView title;
        TextView content;
        TextView evaluate;
        TextView sell;
    }
}</span>

可以看出后来的用法更加方便、灵活,消除了很多的限制,我们只需要根据自己的需要将拿到的数据类型放在自己定义好的适配器中即可,当然这个适配器是根据自己的需要定义好的,在这里自己通过请求获得的是一个实体模型,所以定义时的适配器为实体数组的类型,之后在将数组的各个属性值根据需要和控件一一绑定即可!

<span style="font-size:14px;">if (this.mList != null) {
            //控件绑定数据
            sonSortigns mProductsList = this.mList.get(0).getSonSortings().get(position);
            holder.title.setText(mProductsList.getProducts().get(position).getProName());
            holder.content.setText(mProductsList.getProducts().get(position).getShopPrice());
            holder.evaluate.setText(mProductsList.getProducts().get(position).getHaoping());
            holder.sell.setText(mProductsList.getProducts().get(position).getAreadSell());
        }   </span>

其他的按照统一格式去写即可,唯一需要做的就是将拿到的数据类型解析成自己需要的数据通过viewholer赋值给对应的控件即可!对适配器研究了大概有一周了,期间经历了很多的问题,也被一个个渺小的问题绊倒过很多次,现在走过来确实感受到了适配器的强大,也体会到了大牛们服务于人的崇高境界!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 22:02:07

巧秒构造造就强大的adapter的相关文章

Android的Adapter接口使用详解

Adapter接口主要用于为ListView和Spinner等容器(即AdapterView)提供列表项,是搭建列表项布局与数据之间的链接桥梁.Adapter负责提供每个"列表项"组件,AdapterView(如ListView.Spinner等UI组件)则负责采用合适的方式显示这些列表项. 博客:http://blog.csdn.net/u012637501 一.ListView和ListActivity的基本使用 ListView是Android应用非常广泛的一种组件,它以垂直列表

机械随笔(y一)

过去最巧秒的机械往往是机械对机械自身的控制,然而现在往往只要一块电路板就行了(有点无奈). 可爱可畏的机电一体化. 人类社会第一个巨大进步,效率生产力的极大提高,人口的井喷来自工业革命,来自对钢铁肌肉的力量的首次挖掘利用.而今全球互联网的沟通促成的信息无限交流并未最大限度地提升人类生产力(更不用说某些的商业方面的模式创新).信息的交流是为生产力的提升打下坚实基础,当然强大的云计算也应该是未来生产变革中不可或缺的一环.最终的发展仍然要落实到制造的本体上,毕竟现在的人不可能靠数据流生活,很长很长一段

跟我学Android之十一 列表和适配器

本章内容 第1节  列表类视图概述 第2节  列表视图ListView 第3节  下拉视图Spinner 本章目标 理解MVC模式的设计思想. 了解AdapterView 的继承关系图. 掌握掌握使用各类适配器显示列表数据. 掌握列表视图ListView的用法. 掌握下拉视图Spinner的用法. 列表控件是界面设计中一种常用的控件 u主要用于展现一系列数据项供用户选择或浏览,比如: ?收件箱中的邮件标题列表 ?通讯录中的联系人列表 ?注册用户时的城市选择列表 uAndroid系统中提供了多种形

Android开发:ListView、AdapterView、RecyclerView全面解析

目录 AdapterView简介 AdapterView本身是一个抽象类,AdapterView及其子类的继承关系如下图: 特征: AdapterView继承自ViewGroup,本质是个容器 AdapterView可以包含多个"列表项",并将这多个列表项以合适的形式展示 AdapterView显示的列表项内容由Adapter提供 它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类. 由AdapterView直接派生的三个类: AbsListView.AbsS

zend framework 分页显示 Zend_Paginator的使用

zend framework 提供了一个分页类Zend_Paginator,Zend_Paginator强大的地方在自动分页和导航面板. 构造Zend_Paginator需要提供一个adapter,在手册上提供了五种选择 Adapter:Array,Zend_Db_Select,Zend_Db_Table_Select,Iterator,Null. 如果我们从数据库取得数据,在分页可以使用 Zend_DB_Select或则Zend_Db_Table_Select. 1 class Draft e

如果常量类进行改变时,只编译常量类,而使用常量的类不重新编码,这样改动实际上算没有生效(转)

在Java开发过程中有很多通用的准则,遵守这些准则能够避免很多不必要的错误发生,让代码的质量更高,下面的内容为书籍第一章<Java开发中通用的方法和准则>的阅读笔记. 一.不要在常量和变量中出现易混淆的字母 例如数字1和小写字母l容易混淆,数字0和字母o容易混淆,因此在变量或常量命名时需要避免两个同时出现. 另外命名最好遵守Java编码规范:包名全小写,类名首字母全大写,常量全部大写并用下划线分隔,变量采用驼峰命名法等等. 二.不要让常量蜕变成变量 常量应该保证在编译期就确定其值不变,而不是在

【UVa】12118 Inspector&#39;s Dilemma(欧拉道路)

题目 题目 ? ? 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, 为什么呢?题目要求最短距离,那么必定是欧拉道路,那么为了构造出最短欧拉道路,要将奇度数的点减小至2个,然而各个道路不一定联通,还需要计算一下联通块数量n,结果加上n-1后,再乘t,因为需要n-1条边将各个联通块连接起来. 注意题目已保证每两个点都有路,所以上面才能那么肆无忌惮的连边. ? ? 代码

15. Go 语言“避坑”与技巧

Go 语言"避坑"与技巧 任何编程语言都不是完美的,Go 语言也是如此.Go 语言的某些特性在使用时如果不注意,也会造成一些错误,我们习惯上将这些造成错误的设计称为"坑". Go 语言的一些设计也具有与其他编程语言不一样的特性,能优雅.简单.高效地解决一些其他语言难以解决的问题. 本章将会对 Go 语言设计上可能发生错误的地方及 Go 语言本身的使用技巧进行总结和归纳. goroutine(Go语言并发)如何使用才更加高效? Go语言原生支持并发是被众人津津乐道的特

js的原型链

开篇 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述.有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就说明你没有真正的理解.最近正在读<Javascript高级程序设计>,书中对原型对象和原型链的描述让我受益匪浅,下面仅用一个对比性的例子来说明. 我们经常会这么写 function Person () { this.name = 'John'; } var person = new Person(