打造Android中万能BaseAdapter

什么叫做万能适配器?BaseAdapter android的万能适配器BaseAdapter,通过一个公共的CommonAdapter来实现全部要用到BaseAdapter的ListView 立即下载

如题

作为一个懒人,在用了几次BaseAdapter加ViewHolder之后早已经厌倦了做同样的工作,仔细观察下我们的实现,其实有一些共处是一直有的,在BaseAdapter上再封装一次不就完事了,省了很多力气,直接上代码吧,原理其实很简单

说明:
1. 一些jar需要添加,如JSON的jar
2. MediaLoader很简单,随便写一个就行了
3. 一些后续的优化,如实现个滑动监听器,当停止滑动再加载啊,滑动就停止加载啊(注意AsyncTask的cancel()方法,不会立即停止线程的,实现原理也是线程池,也可以自己写一个玩玩,对线程的停止方法,有另一篇介绍),也可以对内容进行缓存,看自己需求吧

1。通用的ViewHolder

package util;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class ViewHolder
{
    private final SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;
    private int myLayoutId;

    private ViewHolder(Context context, ViewGroup parent, int layoutId,
                       int position)
    {
        this.mPosition = position;
        this.mViews = new SparseArray<View>();
        this.myLayoutId = layoutId;
        //System.out.println("position is "+mPosition+"  初始化时的layoutID is"+myLayoutId);
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
                false);
        // setTag
        mConvertView.setTag(this);
        //System.out.println(position+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }

    public int getMyLayoutId(){
        //System.out.println("position is "+mPosition+"   getLayoutId时的layoutID is"+myLayoutId);
        return this.myLayoutId;
    }

    public int getmPosition() {
        return mPosition;
    }

    public static ViewHolder get(Context context, View convertView,
                                 ViewGroup parent, int layoutId, int position)
    {
        //System.out.println("position is "+position+"   getViewHolder时传入的layoutID is"+layoutId);
        if (convertView == null || position != ((ViewHolder) convertView.getTag()).getmPosition()) {
            //System.out.println("new ViewHolder 之前 position is "+position+"   getViewHolder时的layoutID is"+layoutId);
            return new ViewHolder(context, parent, layoutId, position);
        }
        //System.out.println("不用new的时候getViewHolder  position is "+position+"   getViewHolder时的layoutID is"+layoutId);
        return (ViewHolder) convertView.getTag();
    }

    public View getConvertView()
    {
        return mConvertView;
    }


    public <T extends View> T getView(int viewId)
    {
        View view = mViews.get(viewId);
        if (view == null)
        {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }


}

2.通用的Adapter

package util;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import java.util.List;


/**
 * Created by Coder on 2017/1/1.
 */



public abstract class CommonAdapter<T> extends BaseAdapter implements AbsListView.OnScrollListener
{
    protected LayoutInflater mInflater;
    protected Context mContext;
    protected List<T> beanList;
    protected SparseArray<Integer> mItemLayoutIds;

    public CommonAdapter(Context context, List<T> beanList, SparseArray<Integer> mItemLayoutIds)
    {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mContext);
        this.beanList = beanList;
        this.mItemLayoutIds = mItemLayoutIds;
    }

    public Context getContext(){
        return mContext;
    }

    @Override
    public int getCount()
    {
        return beanList.size();
    }

    @Override
    public T getItem(int position)
    {
        return beanList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder viewHolder = getViewHolder(position, convertView,
                parent);
        convert(viewHolder, getItem(position));
        return viewHolder.getConvertView();
    }

    public abstract void convert(ViewHolder holder, T t);

    private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent)
    {
        //System.out.println("position is "+position+"  传入的 layoutid is"+mItemLayoutIds.get(position));
        return ViewHolder.get(mContext, convertView, parent, mItemLayoutIds.get(position),
                position);
    }

}

3.使用示例
先搞个activity

package zzu.com.news;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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

import Adapter.NewsAdapter;
import Adapter.TestAdapter;
import bean.News;
import util.DataHandler;
import util.MyAsyncTask;

public class NewsActivity extends Activity {

    private Context context;
    private ListView listVIew;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_adapter);

        context = this;

        listVIew = (ListView)findViewById(R.id.lv_main);

        new MyAsyncTask(context, listVIew).execute("http://192.168.1.107:8080/news/ShowNewsService?currentPage=5","newsList");

    }

}

再把要显示的JSON数据从服务器获取下来,把数据和布局文件打包链表扔进NewsAdapter里,NewsAdapter是根据CommonAdapter重写的,下面有代码

package util;

/**
 * Created by Coder on 2017/1/5.
 */

import android.content.Context;
import android.os.AsyncTask;
import android.util.SparseArray;
import android.widget.BaseAdapter;
import android.widget.ListView;

import com.google.gson.Gson;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import Adapter.NewsAdapter;
import Adapter.TestAdapter;
import bean.ShowNewsBean;
import zzu.com.news.R;


/**
 * Created by Coder on 2017/1/5.
 */

public class MyAsyncTask extends AsyncTask<String, Void, JSONArray> {
    private Context context;
    private ListView view;

    public MyAsyncTask(Context context, ListView view){
        this.context = context;
        this.view = view;
    }

    @Override
    protected JSONArray doInBackground(String... params) {

        return DataHandler.getJsonArray(params[0], params[1]);
    }

    @Override
    protected void onPostExecute(JSONArray jsonArray) {
        super.onPostExecute(jsonArray);

        SparseArray<Integer> mItemLayoutIds = new SparseArray<Integer>();
        List<ShowNewsBean> newsList = new ArrayList<>();
        try {

            JSONObject jsonObject = null;
            for(int i=0; i<jsonArray.length(); i++){

                jsonObject = jsonArray.getJSONObject(i);
                System.out.println(jsonObject.toString());
                //对JSON-》Bean
                Gson gson = new Gson();
                ShowNewsBean news = gson.fromJson(jsonObject.toString(), ShowNewsBean.class);
                System.out.println(news.toString());
                newsList.add(news);
                //将布局传入
                if(news.getNewsType() == 1){
                   mItemLayoutIds.put(i, R.layout.listview_demo3);
                }else if(news.getNewsType() == 2){
                   mItemLayoutIds.put(i, R.layout.listview_demo2);
                }else if(news.getNewsType() == 3){
                     mItemLayoutIds.put(i, R.layout.listview_demo);
                }else{
                   mItemLayoutIds.put(i, R.layout.video_item_layout);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        NewsAdapter myAdapter = new NewsAdapter(context, newsList, mItemLayoutIds);

        view.setAdapter(myAdapter);

    }
}

最后重写下CommonAdapter就行了

package Adapter;


import android.content.Context;

import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;

import org.json.JSONException;
import org.json.JSONObject;


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

import bean.Media;
import bean.ShowNewsBean;
import util.CommonAdapter;
import util.ImageLoader;
import util.MediaLoader;
import util.VideoLoader;
import util.ViewHolder;
import zzu.com.news.R;
import com.google.gson.Gson;

/**
 * Created by Coder on 2017/1/5.
 */

public class NewsAdapter extends CommonAdapter<Object> {
    private MediaLoader mediaLoader;
    protected List beanList;
    protected List<Object> taskList;

    public NewsAdapter(Context context, List beanList, SparseArray<Integer> mItemLayoutIds) {
        super(context, beanList, mItemLayoutIds);
        this.beanList = beanList;
        taskList = new ArrayList<>();
        mediaLoader = new MediaLoader();
    }

    @Override
    public void convert(ViewHolder holder, Object object) {

        final ShowNewsBean news = (ShowNewsBean)object;
        //把bean中的数据塞到view中

        if(news.getNewsType() == 1){
            ((TextView) holder.getView(R.id.thirdtitle)).setText(news.getTitle());
            System.out.println("1");
        }else if(news.getNewsType() == 2){

            System.out.println(" getMyLayoutId is ="+holder.getMyLayoutId()+" R.layout.listview_demo2 is "+R.layout.listview_demo2+" ~!!!!!!!!!!!!!!");
            ((TextView) holder.getView(R.id.nexttitle)).setText(news.getTitle());

            List<Media> mediaList = news.getMediaList();
            ImageView imageView = holder.getView(R.id.nextpicture);
            //设置url作为tag防止重复加载
            imageView.setTag(mediaList.get(0).getMediaUrl());
            System.out.println("url is "+mediaList.get(0).getMediaUrl());
            //imageLoader.showImageByAnsycTask(imageView, mediaList.get(0).getMediaUrl());
            mediaLoader.show(imageView, mediaList.get(0).getMediaUrl());
        }else if(news.getNewsType() == 3){

            //设置url作为tag防止重复加载
            ((TextView) holder.getView(R.id.title)).setText(news.getTitle());
            List<Media> mediaList = news.getMediaList();
            ImageView imageView = holder.getView(R.id.picture1);
            imageView.setTag(mediaList.get(0).getMediaUrl());
            mediaLoader.show(imageView, mediaList.get(0).getMediaUrl());

            imageView = holder.getView(R.id.picture2);
            imageView.setTag(mediaList.get(1).getMediaUrl());
            mediaLoader.show(imageView, mediaList.get(1).getMediaUrl());

            imageView = holder.getView(R.id.picture3);
            imageView.setTag(mediaList.get(2).getMediaUrl());
            mediaLoader.show(imageView, mediaList.get(2).getMediaUrl());
        }else{
            ((TextView)holder.getView(R.id.video_name_text)).setText(news.getTitle());

            final Context context = getContext();
            final VideoView videoView = holder.getView(R.id.videoview);
            final ImageButton play = holder.getView(R.id.video_play_btn);

            play.setOnClickListener(new View.OnClickListener() {
                private boolean flag = false;
                @Override
                public void onClick(View v) {
                    if(flag == false){
                        play.setVisibility(ImageButton.INVISIBLE);
                        System.out.println(news.getMediaList().get(0).getMediaUrl()+"!!!!!!!!!!!!!!!");
                        MediaLoader mediaLoader = new MediaLoader();
                        mediaLoader.show(videoView, news.getMediaList().get(0).getMediaUrl());
                        MediaController myController = new MediaController(context);
                        videoView.setVisibility(View.VISIBLE);
                        myController.setAnchorView(videoView);
                        myController.setMediaPlayer(videoView);
                        videoView.setMediaController(myController);
                        videoView.requestFocus();

                        flag = true;
                    }else{
                        videoView.pause();
                        flag = false;
                    }
                }
            });


        }

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//        start = firstVisibleItem;
//        end = firstVisibleItem + visibleItemCount;
        Log.i("TAG", "firstVisibleItem "+firstVisibleItem);
        Log.i("TAG", "visibleItemCount "+visibleItemCount);
        Log.i("TAG", "totalItemCount "+totalItemCount);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(scrollState == SCROLL_STATE_IDLE){
            //停止滑动 开始加载

        }else{
            //正在滑动 停止加载

        }
    }
}

【数据分享】中国371个城市的坡度矢量数据和excel数据 在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。 阅读详情

相关推荐

车道线检测(传统基于Opencv的方法)

传统车道线检测方法主要是使用颜色选择、高斯平滑、边缘检测、ROI区域选择、霍夫变换、标定车道边界等Opnecv图像处理操作去检测道路上的车道线,我自己对很多用这类处理对很多道路场景车道线进行过实验,这类算法往往需要人工根据不同街道场景手动去反复调整各算法参数,从而才能使检测效果最佳。

Yangxiaoaijiejie的博客 2072

Android 非常好用的万能BaseAdapter

在打代码过程中,越来越发现封装的重要性。于是,封装了一个BaseAdapter的基类,省去了每次重写BaseAdapter要做的凡庸,冗余的代码。         这个类可以省去自己写Viewholder,也可以在不确定数据源,item时,继承我写的这个基类即可轻松为适配器类型的控件写出适配器,下面就是示例代码:public abstract class AllPowerAdapter<T>

女程序媛的自我修养 1834

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

13.Android中万能的BaseAdapter的使用

大家好,今天给大家讲解一下Android BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner、ListView、GridView)来填充数据的。而(Spinner、ListView、GridView)都有自己的适配器(记起来麻烦)。但是BaseAdapter(一招鲜)对他们来说却是通用的,为什么这么说呢,首先我们看一下API文档: 我们看到Android

wangjia55的专栏 5万+

U8采购入库单CO接口开发实战:加载、新增与删除操作详解

本文详细解析了用友U8采购入库单CO接口的开发实战,重点介绍了加载、新增与删除三大核心操作的实现方法。通过C#代码示例和实际项目经验,帮助开发者高效处理采购入库单,提升企业供应链管理效率。文章还涵盖了环境配置、异常处理、性能优化等关键技巧,适合U8二次开发人员参考。

weixin_33462927的博客 373

基于COMSOL电弧动态仿真模型优化:高收敛性可修改吹弧方案解析

在多物理场耦合分析中,电弧动态仿真历来是数值稳定性的难点:温度从室温跃升至数万开尔文,电导率随温度呈数量级跳变,流动、传热与电磁场相互牵制,极易引发求解器不收敛或初始值不一致等问题。如何构建高收敛性的数值模型,成为开关设备灭弧性能优化的重要技术基础。通过合理的几何简化、全耦合求解器配置、辅助扫描初始化策略以及参数化建模手段,可以实现对吹弧方案的灵活调整与批量寻优,从而系统性评估气流速度、喷口形状、触头间距等关键因素对熄弧性能的影响。这类仿真方法广泛应用于断路器、接触器等高压电器产品研发,为灭弧室结构设计提供

weixin_29758911的博客 350

basequickadapter详解_万能适配器BaseQuickAdapter简单使用

BaseQuickAdapter——RecyclerView通用适配器RecyclerView是Android L版本中新添加的一个用于取代ListView的SDK,具有灵活性和可替代性比ListView更好,RecyclerView同样也用到适配,作为开发者,我们希望有一款通用的适配。BaseQuickAdapter 就是一款为Android开发者打造的针对繁琐的适配器的构建的快速开源项目。Ba...

weixin_30569443的博客 4470

【新华三】通过路由复制实现Public与VRF路由互通

如上图所示,S6900设备里有两张表,一张是public路由表,默认所有的路由都存放在public路由表里;除此之外还创建了VRF test,因此此设备还有VRF test路由表。通过路由复制实现Public路由和VRF路由互通,默认情况下VRF里的路由单独一张路由表,默认情况下与public路由表相互隔离,两张表之间不可互访。此时的public路由表里面并没有test的路由表。public路由表与VRF路由表之间相互隔离。此时VRF test里的路由也没有其他VRF或Public里的路由,相互隔离。

五大连池的镜子 5278

Android中的万能适配器——base-adapter-helper解析

在Android开发中,我们经常会用到ListView、GridView,每次编码的时候都需要为他们写对应的Adapter,写多了就感觉很烦躁了,因为基本的编程思想都是一样的,但是每次都要重复去写,所以我们能不能把它们抽象成一个通用的模板,这样就不用每次都重复写相同的代码了,直接重复使用,这样不是更好,下面我们就来介绍介绍一个开源项目base-adapter-helper。传统Adapter的编码...

欢迎关注微信公众号:DroidMind 7056

RT-Thread精通PM功耗调优 - Tickless篇

背景 让别人的思想装到自己的脑袋里,这不仅需要威逼利诱,还需要讲清楚原理。喜欢才能接受。 功耗基本的调试手段,估计前面讲了很多,或许只有少数人群可以接受。 更有极少的人,了解了整个功耗管理的体系、原理,愿意接受这样的【安排】。 这里的功耗调优思路,其实只是解决功耗问题的一种思路,并不是框架。 解决问题,自古以来,都是千奇百怪,秒在【奇】。 介绍 本篇介绍下Tickless的工作原理。 Tickless 可以理解为:tick-less,tick or little tick。 tick定.

坚韧与专注 1529

【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part2知识获取与图谱构建、服务搭建

前序文章:其中原项目提供了关系数据如下: 其中五列数据表示:人物1,人物2,人物1与人物2关系,人物1所属家族,人物2所属家族。关系说明:以第一列为例,贾演是贾代化的父亲。下面我们就将这个数据放到neo4j中。这些需要去连接,需要安装这个包: 程序中,我使用去读取配置文件, 其中为了保持配置全局唯一性,使用单例的写法。 后面就是创建构建关系文件,构建neo4j图谱数据了,如下: 后期可能会将构建图谱内容使用flask去生成命令行的方式构建,暂时在开发的过程查看构建情况,便于调试。导入关系后,我们再查看

让算法融入生活,改变生活! 4080

打造适配ListView的万能BaseAdapter

前言:将对照传统与万能写法,实现一个简单效果。 一:传统写法

fsx_xiaomei的博客 420

23种设计模式-享元(Flyweight)设计模式

软考中级-软件设计师 享元设计模式

片言可决讼,半纸能缚龙 3223

打造适配RecyclerView的万能BaseAdapter

前言:上篇文章写了打造适配ListView的万能Adapter,有需要的请转:https://blog.youkuaiyun.com/fsx_xiaomei/article/details/88824907 ,今天来打造适配RecyclerView的万能BaseAdapter。 一、一般写法 RecyclerActivity(需要注意的是,RecyclerView一定要setLayoutManager,否则...

fsx_xiaomei的博客 484

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

打造一个万能的适配器!!!

最近项目中 经常用listView和GridView ,可以说是项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter 最近抽了时间,自己也打造了一个万能的适配器 看我们之前的一些写法: public class ImageViewAdapter2 extends RecyclerView.Adapter<ImageV...

beibei_programme的博客 181

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 自定义baseadapter listview,Android 自定义 BaseAdapter 最佳实践

虽然现在很多新的项目都在使用RecyclerView,但是很多开发者在一些场景中还是倾向使用ListView或者GridView,然后就是需要写许多的Adapter。一次项目组在新启动一个新项目的时候,有个同事拿来了一个网上说的万能Adapter,在使用的时候发现即使在单个视图类型一旦逻辑判断比较复杂情况下非常不方便,更不用说在适配器Adapter中使用多视图类型了,这里仅是个人观点,也许没有掌握...

weixin_35834213的博客 182

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 快速开发系列 打造万能的ListView GridView 适配器

时间长了,基本就完善了。我们的CommonAdapter依然是一个抽象类,除了getView以外我们把其他的代码都实现了,这样的话,在使用我们的Adapter只要实现一个getView,然后getView里面再使用我们打造的通过的ViewHolder是不是感觉还不错~继续分析,Adapter一般需要保持一个List对象,存储一个Bean的集合,不同的ListView,Bean肯定是不同的,这个CommonAdapter肯定需要支持泛型,内部维持一个List,就解决我们的问题了;

2501_90229370的博客 617

Miniforge 多环境实战:如何在一台机器上切换多套 Python 版本

手头两个项目,一个锁死在 Python 3.8,另一个要吃 3.12 的新语法。别折腾系统 Python 了,Miniforge 给每个项目建一个独立环境,多版本切换就是几行 conda 命令的事。 ## Miniforge 是什么:和系统 Python、venv 差在哪 Miniforge 是 conda-forge 官方的最小发行版:装完你手里有 conda 和 mamba 两条命令,默认

gitblog_00091的博客 374

Android万能适配器baseAdapter:告别繁琐代码的终极指南

在Android开发中,适配器(Adapter)是连接数据与UI组件的桥梁,尤其在ListView、RecyclerView等列表控件中扮演着关键角色。然而,传统适配器实现往往需要编写大量重复代码,处理多种Item类型时更是复杂。**baseAdapter**作为一款万能适配器框架,彻底改变了这一现状,让开发者能够以更简洁的方式处理各种列表展示需求。 ## 🚀 为什么选择baseAdapter

gitblog_00001的博客 401

教你打造一个万能的适配器

最近项目中 经常用listView和GridView ,可以说是项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter 最近抽了时间,自己也打造了一个万能的适配器 看我们之前的一些写法: public class ImageViewAdapter2 extends RecyclerView.Adapter {

king_zxy的博客 290

终极 Android 万能 Adapter:快速掌握 ListView 与 RecyclerView 适配方案

baseAdapter 是一款专为 Android 开发者打造的万能适配工具,能够轻松应对 ListView、RecyclerView 和 GridView 等多种列表控件,尤其擅长处理复杂的多 Item 类型场景。无论是简单的单列列表还是包含多种布局的复杂界面,这款适配器都能帮助开发者大幅减少重复代码,提升开发效率。 ## 为什么选择 baseAdapter? 在 Android 开发中,编

gitblog_07557的博客 707

android 手把手教你打造万能的ListView GridView的适配器

android 手把手教你打造万能的ListView GridView的适配器

zhouguizhi 1084

miniblink49 中 Google Mock FAQ 深度解析:C++ Mock 测试的疑难杂症与源码级答案

miniblink49 是一个小巧、轻量的浏览器内核,仓库在 `v8_6_7/testing/gmock/` 下捆绑了完整的 Google Mock(Google C++ 官方 Mock 框架)及其测试代码。本文以 [v8_6_7/testing/gmock/docs/FrequentlyAskedQuestions.md](https://link.gitcode.com/i/18011fca9

gitblog_00013的博客 305

Android 快速开发 打造万能的ListView GridView 适配器

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/38902805 ,本文出自【张鸿洋的博客】 1、概述 相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~对于Adapter一般都继承BaseA

merbn的博客 519

打造万能Viewholder,告别重复代码

每次写ListView显示列表都会重复写出if(convertview == null){}else{} 这些重复的代码,既然是重复的,肯定是可以提取复用的。。。 开始咯: 首先CommonAdapter类继承BaseAdapter并实现其方法,因为我们要做到灵活性,所以实体类,item布局都是要传进来的 public CommonAdapter(Context context, List

郑飞的专栏 711
上一篇: 多线程实现断点续存
下一篇: C语言中的通用编程
aNoobCoder
博客等级 码龄10年 2粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值