首页 > 其他分享 >超级好用的仿recycleview的listview适配器与viewholder封装

超级好用的仿recycleview的listview适配器与viewholder封装

时间:2022-11-24 23:05:14浏览次数:56  
标签:viewholder return int 适配器 recycleview viewHolder context data public


由于公司项目频繁使用适配器,于是就使用java牛逼的泛型写了这和Recycleviwew那样的设计架构的lsitview adapter


超级好用的仿recycleview的listview适配器与viewholder+ javabean 解耦

已经实现好了复用了,另外如果要给适配器设置tag,你也可以改我这代码的,比如改我这个价一个资源id绑定什么的,

超级简单实用,比谁的都简单。绝对原创,你不要嘲笑我说这个东西过时了,我一直在用pulltoRefushListview做下拉上拉,而recyclview还是有一点的局限性的.暂时没发现牛逼人物做到了用recycleview实现了上拉下拉 左拉右拉,公司的项目横向刷新我采用的也是recycleview,但是我都没有做那个拉的回弹什么的,只是当到了最后一条就自动加载更多....好了废话不多说了,希望大家喜欢我的文章,为我点赞,特别是github的项目哈...

​http://github.com/51bwn​



SuperAdapter.java

/**
* Created by luozheng on 2015/11/7.
update 2016-01-07 15:10:03

*/
public abstract class SuperAdapter<T,VH extends BaseViewHolder> {

public int mPage;
private String TAG="DefaultAdapter";
public List<T> data;
public Context context;

public List<T> getData(){
return this.data;
}
public void setData(List<T> data) {
this.data = data;
}
public SuperAdapter() {


}
public SuperAdapter(Context context) {
this.context=context;
}

public SuperAdapter(List<T> data, Context context) {
this.data = data;
this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

VH viewHolder = null;
int itemViewType = getItemViewType(position);
if (convertView == null) {
viewHolder = onCreateViewHolder(parent, itemViewType);//请再里面给itenview赋值。。。
viewHolder.itemview.setTag(viewHolder);
}else{
viewHolder = (VH) convertView.getTag();
}
onBindViewHolder(viewHolder,position,itemViewType);
return viewHolder.itemview;
}

/**
* 创建一个viewholder,并给view的itemview赋值
* @return
*/
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
//viewholder
public abstract void onBindViewHolder(VH viewHolder,int position,int viewType);

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

@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getCount() {
return data==null?0: data.size();
}

}


BaseViewHolder.java


mport android.view.View;

/**
* Created by luozheng on 16/1/7.
*/
public class BaseViewHolder {
public View itemview;

public BaseViewHolder(View view) {
this.itemview = view;
this.itemview.setTag(this);
// onSetTag(view);
}
// abstract void onSetTag(View view);
}


SuperAdapter


/**
* Created by luozheng on 2015/11/7.
* update 2016-01-07 15:10:03
*/
public abstract class SuperAdapter<T, VH extends RecyclerView.ViewHolder> extends BaseAdapter {

public int mPage;
private String TAG = "DefaultAdapter";
public List<T> data;
public Context context;

public List<T> getData() {
return this.data;
}

public void setData(List<T> data) {
this.data = data;
}

public SuperAdapter(Context context) {
this.context = context;
}

public SuperAdapter(List<T> data, Context context) {
this.data = data;
this.context = context;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

VH viewHolder = null;
int itemViewType = getItemViewType(position);
if (convertView == null) {
viewHolder = onCreateViewHolder(parent, itemViewType);//请再里面给itenview赋值。。。
viewHolder.itemView.setTag(R.id.convert_tag, viewHolder);
} else {
viewHolder = (VH) convertView.getTag(R.id.convert_tag);
}
onBindViewHolder(viewHolder, position, itemViewType);
return viewHolder.itemView;
}

/**
* 创建一个viewholder,并给view的itemview赋值
*
* @return
*/
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);

//viewholder
public abstract void onBindViewHolder(VH viewHolder, int position, int viewType);

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

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

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

}



如何使用?


附上一个使用的例子,这个例子就是我做公司交给我的闹钟提醒需求viewholder,和adapater:

viewholder

/**
* Created by luozheng on 16/2/16.
*/
public class RemindViewHolder extends BaseViewHolder {

public final TextView tvTime;
public final TextView tvMode;
public final TextView tvContent;
public final CheckBox checkBox;
public final ImageView ivDelete;
public final View viewType;

public RemindViewHolder(View view) {
super(view);
viewType = view.findViewById(R.id.view_type);
tvMode = (TextView) view.findViewById(R.id.tv_content1);
tvTime = (TextView) view.findViewById(R.id.tv_content2);
tvContent = (TextView) view.findViewById(R.id.tv_content3);
checkBox = (CheckBox) view.findViewById(R.id.switchButton);
ivDelete = (ImageView) view.findViewById(R.id.iv_delete);
}
}



adapter



import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.Toast;



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

/**
* Created by luozheng on 16/2/16.
*/
public class RemindAdapter extends SuperAdapter<RemindModel,BaseViewHolder> {

private static final String TAG = "RemindAdapter";
private RemindEngine remindEngine;

public RemindAdapter(Context context) {
super(context);
remindEngine = new RemindEngine();
}

public RemindAdapter(List<RemindModel> data, Context context) {
super(data, context);
remindEngine = new RemindEngine();

}

@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

switch (viewType) {
case TYPE_HEAD_ADD:
return new BaseViewHolder(LayoutInflater.from(context).inflate(R.layout.view_remind_item_head,parent,false));
case TYPE_DATA:
return new RemindViewHolder(LayoutInflater.from(context).inflate(R.layout.view_remind_item,parent,false));
default:
return null;
}
}

@Override
public int getCount() {
return super.getCount()+1;//包含头部一个
}


@Override
public int getItemViewType(int position) {//返回的值就是数组下标 - -不能超过getViewTypeCount大小
if(position<=0){
return VIEWTYPE[0];//0 -1 2
}else{
return VIEWTYPE[1];//1
}
}

@Override
public int getViewTypeCount() {
return 2;
}
int[] VIEWTYPE;
final int TYPE_HEAD_ADD = 0;
final int TYPE_DATA = 1;
{
VIEWTYPE = new int[]{TYPE_HEAD_ADD, TYPE_DATA};
}
@Override
public void onBindViewHolder(BaseViewHolder baseviewHolder, final int position, int viewType) {
switch (viewType){
case TYPE_HEAD_ADD:
baseviewHolder.itemview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onAddClickListener!=null){
onAddClickListener.onClick();
}
}
});
break;
case TYPE_DATA:
RemindViewHolder viewHolder= (RemindViewHolder) baseviewHolder;
final int temp_position=position-1;
final RemindModel remindModel = getData().get(temp_position);

viewHolder.tvContent.setText(""+remindModel.getClass_title());
viewHolder.tvTime.setText(CalendarUtils.intAppendZero(remindModel.getHour())+":"+CalendarUtils.intAppendZero(remindModel.getMinute()));
RemindModel.MODE currentMode = remindModel.getCurrentMode();
RemindModel.RemindTYPE remindType = remindModel.getRemindType();
Log.i(TAG,"remindModel:"+remindModel);
switch (remindType){
case GETUP:
viewHolder.viewType.setBackgroundResource(R.drawable.shape_oval_red);
break;
case GOTBED:
viewHolder.tvTime.setText(""+remindModel.getMinute()+"分钟后");
viewHolder.viewType.setBackgroundResource(R.drawable.shape_oval_blue);
break;
case REMIND:
viewHolder.viewType.setBackgroundResource(R.drawable.shape_oval_green);
break;
}
switch (currentMode){
case ONE:
viewHolder.tvMode.setText("一次");
break;
case EVERYDAY:
viewHolder.tvMode.setText("每天");
break;
case WORKDAY:
viewHolder.tvMode.setText("工作日");
break;
case CUSTOM:
ArrayList<Integer> customDays = remindModel.getCustomDays();
StringBuilder sb=new StringBuilder();
for (Integer customDay : customDays) {
sb.append("星期"+ StringUtils.intWeekDayToString(customDay)+" ");
}
viewHolder.tvMode.setText(""+sb.toString());
break;
}
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked==remindModel.isEnabled()){
return;//证明当前只是查询并赋值
}
RemindDao remindDao=new RemindDao(context);
if(isChecked){
remindEngine.registerCurrentAlarm(context,remindModel);
}else{
remindEngine.unregisterCurrentAlarm(context,remindModel);
}
remindModel.setEnabled(isChecked);
remindDao.update(remindModel,"enabled");

notifyDataSetChanged();
}
});
viewHolder.checkBox.setChecked(remindModel.isEnabled());
viewHolder.ivDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder alertDialog=new AlertDialog.Builder(context);
alertDialog.setIcon(R.drawable.ic_launcher);
alertDialog.setTitle(""+remindModel.getClass_title());
alertDialog.setMessage("真的要删除吗?");
alertDialog.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(remindModel.getRemindType()!= RemindModel.RemindTYPE.REMIND){
Utils.showToast(context,"叫我起床提醒或伴我睡觉定时任务的id一经初始化就不能再删除哦!将导致id无法重建哦", Toast.LENGTH_LONG);
return;
}
if(remindModel.isEnabled()){
remindEngine.unregisterAlerm(context,remindModel);
}
RemindDao remindDao=new RemindDao(context);
remindDao.delete(remindModel.getId());
remindDao.close();
getData().remove(temp_position);
notifyDataSetChanged();
}
});
alertDialog.setNegativeButton("取消",null);
alertDialog.show();
}

});
break;
}


}
public interface OnAddClickListener {
public void onClick();

}

public OnAddClickListener getOnAddClickListener() {
return onAddClickListener;
}

public void setOnAddClickListener(OnAddClickListener onAddClickListener) {
this.onAddClickListener = onAddClickListener;
}

OnAddClickListener onAddClickListener;
}


上面的适配器是listview需求中比较常见的多种item的实现。没有基础的可以看下面这个简单一点的- -


/**
* Created by luozheng on 2016-01-06 14:42:12.
*/
public class StoryListAdapter extends SuperAdapter<BaseStoryModel,StoryListViewHolder> {

private HomeModel playListHomeModel;

public StoryListAdapter(List<BaseStoryModel>baseStoryModels, Context context) {
super(baseStoryModels,context);
playListHomeModel = GlobalInfo.getPlayListHomeModel();
if(playListHomeModel==null){
playListHomeModel=new HomeModel();
}
}

@Override
public StoryListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new StoryListViewHolder(LayoutInflater.from(context).inflate(R.layout.view_item_play_list,parent,false));
}
@Override
public void onBindViewHolder(StoryListViewHolder viewHolder, int position, int viewType) {
final BaseStoryModel storyModel = getData().get(position);

}



总之我写的都是 javaben viewhoder,adapter的结合了..不需要bean的可以再进行修改咯,不过几乎没有不用bean的吧?上面的baseStoryModel就是一个bean了。


new adapter的时候传递 的是list集合 里面放的是上面申明的javabean。。。


更多内容关注:http://github.com/qssq

标签:viewholder,return,int,适配器,recycleview,viewHolder,context,data,public
From: https://blog.51cto.com/u_15458814/5885144

相关文章

  • 适配器模式c++
    [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。  #include<iostream>usingnamespacestd;classCat{public:virtualvoid......
  • 适配器模式
    Adapter模式:我的电脑只有Type-c接口,要使用usb设备,那就需要适配器来进行转接。构成:目标接口(Target):用户所期待的接口,抽象类、或者是具体的类,比如电脑上的type-c接口。......
  • Adapter 适配器模式(结构型模式)
    意图:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。要点:1、Adapter模式......
  • 适配器模式
    一、对象适配器(关联委派)1、被适配者类Adaptee:原有的属性和方法。2、目标接口Target:新增一些方法。3、适配器类Adapter:持有被适配者类Adaptee的对象,即Adaptee类委派给Adapte......
  • 可编程 USB 转串口适配器
    概述可编程USB转UART/I2C/SMBus/SPI/CAN/1-Wire适配器USB2S(USBToSerialports)是多种数字接口物理层协议转发器,自带强大灵活的S2S协议固件程序,支持嵌入C语言程序开发,可实现......
  • 关于VMware的将主机虚拟适配器连接到次网络无法选中的问题
    这个问题的原因可能是,你之前卸载VMware的时候,没有卸载完全,所以注册表还存在一些相关的垃圾这里需要用到CCleaner  然后就可以勾上了  ......
  • 06.适配器模式
    适配器模式作为两个不兼容的接口之间的桥梁结合了两个独立接口的功能例如实际中有个两孔的插座,现在需要有个三孔的插口,如果不直接在两孔的class修改,就需要加一个适配cla......
  • 软件设计模式白话文系列(七)适配器模式
    1、描述适配器模式顾名思义就是将某个类的接口转换成客户端期望的另一个接口表示。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。2、适用性客户端需要调用现......
  • windows 2019 STD域控,域管理员打不开网络适配器选项
    问题:解决办法:在域控的里新建一条策略 ,并把该调策略链接到所有用户。计算机配置/Windows设置/安全设置/本地策略/安全选项/用户账户控制:  用于内置管理员账号的管......
  • 设计模式学习(七):适配器模式
    设计模式学习(七):适配器模式作者:Grey原文地址:博客园:设计模式学习(七):适配器模式CSDN:设计模式学习(七):适配器模式适配器模式适配器模式是一种结构型模式。举例说明,假设有一......