BaseAdapter的封装(ListView)

news/2024/7/4 10:26:46

首先第一步:我们看下我们一般情况下我们的BaseAdapter的使用

public class ProductAdapter extends BaseAdapter {

private List<Product> productList;

public ProductAdapter(List<Product> productList) {
    this.productList = productList;
}

@Override
public int getCount() {
    return productList == null ? 0 : productList.size() + 1;
}

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

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

//将具体的集合数据装配到具体的一个item layout中。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.e("TAG", "parent = " + parent.getClass().toString());
    Log.e("TAG", "parent.getContext() = " + parent.getContext());

    int itemViewType = getItemViewType(position);
    if(itemViewType == 0){
        TextView tv = new TextView(parent.getContext());
        tv.setText("与子同行,奈何覆舟");
        tv.setTextColor(UIUtils.getColor(R.color.text_progress));
        tv.setTextSize(UIUtils.dp2px(20));
        return tv;
    }

    if(position > 3){
        position--;
    }

    ViewHolder holder;
    if (convertView == null) {
        convertView = View.inflate(parent.getContext(), R.layout.item_product_list, null);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }
    //装配数据
    Product product = productList.get(position);
    holder.pMinnum.setText(product.memberNum);
    holder.pMinzouzi.setText(product.minTouMoney);
    holder.pMoney.setText(product.money);
    holder.pName.setText(product.name);
    holder.pProgresss.setProgress(Integer.parseInt(product.progress));
    holder.pSuodingdays.setText(product.suodingDays);
    holder.pYearlv.setText(product.yearRate);

    return convertView;
}

//不同的position位置上,显示的具体的item的type值
@Override
public int getItemViewType(int position) {
    if(position == 3){
        return 0;
    }else{
        return 1;
    }
}
//返回不同类型的item的个数
@Override
public int getViewTypeCount() {
    return 2;
}

static class ViewHolder {
    @BindView(R.id.p_name)
    TextView pName;
    @BindView(R.id.p_money)
    TextView pMoney;
    @BindView(R.id.p_yearlv)
    TextView pYearlv;
    @BindView(R.id.p_suodingdays)
    TextView pSuodingdays;
    @BindView(R.id.p_minzouzi)
    TextView pMinzouzi;
    @BindView(R.id.p_minnum)
    TextView pMinnum;
    @BindView(R.id.p_progresss)
    RoundProgress pProgresss;

    ViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}
}

第一次封装

public abstract class MyBaseAdpapter<T> extends BaseAdapter {
List<T> list;

public MyBaseAdpapter(List<T> list) {
    this.list = list;
}

@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) {
    View view=myGetView(position, convertView, parent);
    return view;
}

public abstract View myGetView(int position, View convertView, ViewGroup parent);
}

然后可以这样使用 public class ProductAdapter1 extends MyBaseAdpapter { public ProductAdapter1(List list) { super(list); }

@Override
public View myGetView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = View.inflate(parent.getContext(), R.layout.item_product_list, null);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }
    //装配数据
    Product product = list.get(position);
    holder.pMinnum.setText(product.memberNum);
    holder.pMinzouzi.setText(product.minTouMoney);
    holder.pMoney.setText(product.money);
    holder.pName.setText(product.name);
    holder.pProgresss.setProgress(Integer.parseInt(product.progress));
    holder.pSuodingdays.setText(product.suodingDays);
    holder.pYearlv.setText(product.yearRate);

    return convertView;
}
static class ViewHolder {
    @BindView(R.id.p_name)
    TextView pName;
    @BindView(R.id.p_money)
    TextView pMoney;
    @BindView(R.id.p_yearlv)
    TextView pYearlv;
    @BindView(R.id.p_suodingdays)
    TextView pSuodingdays;
    @BindView(R.id.p_minzouzi)
    TextView pMinzouzi;
    @BindView(R.id.p_minnum)
    TextView pMinnum;
    @BindView(R.id.p_progresss)
    RoundProgress pProgresss;

    ViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}
}

第二次封装:对getView进行封装

public abstract class MyBaseAdpapter1<T> extends BaseAdapter {
List<T> list;

public MyBaseAdpapter1(List<T> list) {
    this.list = list;
}

@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 = initView(parent.getContext());
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    T t = list.get(position);//获取集合数据
    setData(convertView,t);//设置控件数据
    return convertView;
}

protected abstract void setData(View convertView, T t);

protected abstract View initView(Context context);

class ViewHolder {

    public ViewHolder(View itemView) {

    }
  }
}

可以这样使用:

public class ProductAdapter2 extends MyBaseAdpapter1<Product> {

public ProductAdapter2(List<Product> list) {
    super(list);
}

@Override
protected void setData(View convertView, Product product) {
    ((TextView)convertView.findViewById(R.id.p_name)).setText(product.name);
    ((TextView)convertView.findViewById(R.id.p_money)).setText(product.money);
    ((TextView)convertView.findViewById(R.id.p_yearlv)).setText(product.yearRate);
    ((TextView)convertView.findViewById(R.id.p_suodingdays)).setText(product.suodingDays);
    ((TextView)convertView.findViewById(R.id.p_minzouzi)).setText(product.minTouMoney);
    ((TextView)convertView.findViewById(R.id.p_minnum)).setText(product.memberNum);
    ((RoundProgress)convertView.findViewById(R.id.p_progresss)).setProgress(Integer.parseInt(product.progress));
}

@Override
protected View initView(Context context) {
    return View.inflate(context,R.layout.item_product_list,null);
  }
}

第三次封装:

首先MyBaseAdapter

public abstract class MyBaseAdpapter3<T> extends BaseAdapter {
List<T> list;

public MyBaseAdpapter3(List<T> list) {
    this.list = list;
}

@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) {
    BaseHolder holder = null;
    if (convertView == null) {
        holder = getHolder();
    } else {
        holder = (BaseHolder<T>) convertView.getTag();
    }
    T t = list.get(position);
    holder.setData(t);
    return holder.getRootView();
}


public abstract BaseHolder getHolder();
}

我将数据处理放到holder(BaseHolder封装)

public abstract class BaseHolder<T> {
private View rootView;
private T data;

public BaseHolder() {
    rootView = initView();
    rootView.setTag(this);
    ButterKnife.bind(this, rootView);
}


//设置布局
public abstract View initView();

public View getRootView() {
    return rootView;
}

public void setData(T data) {
    this.data = data;
    refreshData();
}

protected abstract void refreshData();

public T getData() {
    return data;
 }
}

举例实现,首先MyHolder继承BaseHolder

 public class MyHolder extends BaseHolder<Product> {
@BindView(R.id.p_name)
TextView pName;
@BindView(R.id.p_money)
TextView pMoney;
@BindView(R.id.p_yearlv)
TextView pYearlv;
@BindView(R.id.p_suodingdays)
TextView pSuodingdays;
@BindView(R.id.p_minzouzi)
TextView pMinzouzi;
@BindView(R.id.p_minnum)
TextView pMinnum;
@BindView(R.id.p_progresss)
RoundProgress pProgresss;

@Override
public View initView() {
    return View.inflate(UIUtils.getContext(), R.layout.item_product_list, null);//UIUtils.getContext(),MyApplication的上下文
}

@Override
protected void refreshData() {
    Product product = this.getData();
    pMinnum.setText(product.memberNum);
    pMinzouzi.setText(product.minTouMoney);
    pMoney.setText(product.money);
    pName.setText(product.name);
    pProgresss.setProgress(Integer.parseInt(product.progress));
    pSuodingdays.setText(product.suodingDays);
    pYearlv.setText(product.yearRate);
   }
}

ProductAdapter3实现方法

public class ProductAdapter3 extends MyBaseAdpapter3 {
public ProductAdapter3(List list) {
    super(list);
}

@Override
public BaseHolder getHolder() {

    return new MyHolder();
  }
}

http://www.niftyadmin.cn/n/3649067.html

相关文章

minio.exe怎么安装_如何在Ubuntu 18.04上使用Minio设置对象存储服务器

minio.exe怎么安装The author selected the Open Internet/Free Speech Fund to receive a donation as part of the Write for DOnations program. 作者选择了“ 开放互联网/言论自由基金会”作为“ Write for DOnations”计划的一部分来接受捐赠。 介绍 (Introduction) From…

[收藏]笑傲职场--如何获得影响力、权力和晋升

笑傲职场(如何在工作中获得、扩大影响力、权力和晋升&#xff09;以下是初稿大纲&#xff0c;有时间再细细道来。      序言&#xff1a;不走弯路就是捷径   内容&#xff1a;   一. 定位的原则   1、 你不能永远同时走两条钢丝   2、 永远站在主流之列   3、 一…

android桌面组件开发

Widget是Android1.5版所引进的特性之一.Widget,可让用户在主屏幕界面及时了解程序显示的重要信息.标准的Android系统已包含几个Widget的示例,如模拟时钟,音乐播放器等. 1、AppWidget 框架类 1、AppWidgetProvider &#xff1a;继承自 BroadcastRecevier &#xff0c; 在AppWid…

网页开端第三次培训笔记

CSS主要内容 1.CSS是一种用来表现HTML或XML等文件样式的计算机语言&#xff0c;是用来美化页面用的&#xff0c;没有网页 则CSS毫无用处&#xff0c;所以CSS需要依赖HTML展示其功能。 CSS 2.CSS基本语法 css样式由选择器和一条或多条以分号隔开的样式声明组成&#xff0c; …

流式布局的使用——使用固定布局

首先可以看下效果图 简单布局使用: <com.hbwj.p2pinvest.ui.FlowLayoutandroid:id"id/flow_hot"android:layout_width"match_parent"android:layout_height"wrap_content"android:background"android:color/holo_blue_light">&l…

Android中关于横竖屏问题

在以前的版本中只要在AndroidManifest.xml文件中对activity指定android:configChanges"keyboardHidden|orientation"属性&#xff0c;转屏的时候就会不再重新调用OnCreate()函数&#xff0c;而是调用onConfigurationChanged()。 但是在自从android3.2以后&#xff0c…

应用双节点,数据库是dg_如何使用节点构建轻量级发票应用程序:数据库和API

应用双节点,数据库是dg介绍 (Introduction) To get paid for goods and services provided, businesses need to send invoices to their customers informing them of the services that they will be charged for. Back then, people had paper invoices which they gave to …

查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)

//search.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "LinkTable.h"#defineMAX_KEY 500//------------------------------数组实现部分----------------------------------/**//* 无序数组顺序查找算法…