在android的开发过程中,我们不可避免的要使用ListView来展示我们的Activity上面的内容。你可以使用很多种方式来实现这一功能,但是如何优雅快速的来实现呢?这就是我要写的了,既为了大家共同进步,也为了以后自己复习方便。话不多说,上代码吧。

首先要在main_activity.xml 文件中写好我们的布局文件其实也就是一个ListView,然后是对于其内每一个Item,我们要展示的布局样式,如item.xml:

"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:background="#FFADAD"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/title"
        android:layout_width="240dp"
        android:layout_height="30dp"
        android:layout_toRightOf="@+id/imageview"
        android:background="#AAAAAA"
        android:text="Title"
        android:gravity="center" />

    <TextView
        android:id="@+id/content"
        android:text="Content"
        android:layout_width="240dp"
        android:layout_height="40dp"
        android:layout_below="@+id/title"
        android:layout_toRightOf="@+id/imageview"
        android:background="#F0000F" />

</RelativeLayout>

然后对应此xml文件,我们需要声明一个bean的方式的java文件,用来封装对应的资源:

package com.example.testproject;

public class ItemBean {

    private int ItemImageView;
    private String ItemTitle;
    private String ItemContent;

    public int getItemImageView() {
        return ItemImageView;
    }
    public void setItemImageView(int itemImageView) {
        ItemImageView = itemImageView;
    }
    public String getItemTitle() {
        return ItemTitle;
    }
    public void setItemTitle(String itemTitle) {
        ItemTitle = itemTitle;
    }
    public String getItemContent() {
        return ItemContent;
    }
    public void setItemContent(String itemContent) {
        ItemContent = itemContent;
    }
    public ItemBean(int itemImageView, String itemTitle, String itemContent) {
        ItemImageView = itemImageView;
        ItemTitle = itemTitle;
        ItemContent = itemContent;
    }
}
//其中需要注意的是构造函数中含有全部的参数

下面就是BaseAdapter的实现类了,为了代码的复用,我把BaseAdapter封装了起来,方便维护和修改,内部包含三个方式,我最推崇的是没有被注释的那个,代码如下:

package com.example.testproject;

import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

@SuppressLint("InflateParams") public class MyAdapter extends BaseAdapter {

    private List<ItemBean>mList;
    private LayoutInflater mInflater;
    public MyAdapter(Context context,List<ItemBean> list){
        mList=list;
        mInflater=LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mList.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return mList.get(arg0);
    }

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

    @Override
    public View getView(int arg0, View convertView, ViewGroup arg2) {

        //Method1:没有用到后面的参数,没有缓存机制每次都是冲更新生成,资源利用度不够高
//      View view =mInflater.inflate(R.layout.item, null);
//      ImageView imageView=(ImageView)view.findViewById(R.id.imageview);
//      TextView title=(TextView)view.findViewById(R.id.title);
//      TextView content=(TextView)view.findViewById(R.id.content);
//      ItemBean bean=mList.get(arg0);
//      imageView.setImageResource(bean.getItemImageView());
//      title.setText(bean.getItemTitle());
//      content.setText(bean.getItemContent());
//      return view;
        //Method1 _end;

        //普通式:利用了ListView的缓存机制,避免了每次都创建ListView
//      if(convertView==null){
//          convertView=mInflater.inflate(R.layout.item, null);
//      }
//      ImageView imageView=(ImageView)convertView.findViewById(R.id.imageview);
//      TextView title=(TextView)convertView.findViewById(R.id.title);
//      TextView content=(TextView)convertView.findViewById(R.id.content);
//      ItemBean bean=mList.get(arg0);
//      imageView.setImageResource(bean.getItemImageView());
//      title.setText(bean.getItemTitle());
//      content.setText(bean.getItemContent());
//
//      return convertView;
        //普通式结束

        //文艺式:避免用findViewById()方法
        ViewHolder viewHolder;
        if(convertView==null){
            viewHolder=new ViewHolder();
            convertView=mInflater.inflate(R.layout.item, null);
            viewHolder.imageView=(ImageView)convertView.findViewById(R.id.imageview);
            viewHolder.title=(TextView)convertView.findViewById(R.id.title);
            viewHolder.content=(TextView)convertView.findViewById(R.id.content);
            convertView.setTag(viewHolder);
        }else{
            viewHolder=(ViewHolder)convertView.getTag();
        }
        ItemBean bean=mList.get(arg0);
        viewHolder.imageView.setImageResource(bean.getItemImageView());
        viewHolder.title.setText(bean.getItemTitle());
        viewHolder.content.setText(bean.getItemContent());

        return convertView;
    }

    class ViewHolder{
        public ImageView imageView;
        public TextView title;
        public TextView content;
    }

}
//最后的内部类仅仅是第三个方法才会用的到的。

最后就是在MainActivity中添加实现了。代码如下:

package com.example.testproject;

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

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<ItemBean>itemBeanList=new ArrayList<ItemBean>();
        for(int i=0;i<=20;i++){
            itemBeanList.add(new ItemBean(
                    R.drawable.ic_launcher,
                    "Title"+i,"Content"+i*i
                    ));
        }
        ListView listView=(ListView)findViewById(R.id.listview);
        listView.setAdapter(new MyAdapter(this,itemBeanList));
    }

}

好了,代码就是这样了,然后看一下程序的效果图吧(界面没有修改,比较难看,望见谅)

Android之BaseAdapter的优雅实现的更多相关文章

  1. android.widget.BaseAdapter调用DataSetObservable.notifyChanged/Invalidated

    在android.widget.BaseAdapter类中定义了两个notifyDataXXX方法. public void notifyDataSetChanged() {     mDataSet ...

  2. Android退出应用最优雅的方式(改进版)

    Android退出应用最优雅的方式(改进版)(转) 我们先来看看几种常见的退出方法(不优雅的方式) 一.容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Act ...

  3. Android笔记——BaseAdapter的使用

    Android中的适配器(Adapter)是数据与视图(View)之间的桥梁,用于对要显示的数据进行处理,并通过绑定到组件进行数据的显示. BaseAdapter是Android应用程序中经常用到的基 ...

  4. [Android]对BaseAdapter中ViewHolder编写简化

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3642849.html 在Android项目中,经常都会用到Li ...

  5. android ArrayAdapter BaseAdapter SimpleAdapter使用讲解

    不是我针对谁,我只想针对新手玩家. 不清楚Adapter作用的可以看一下http://www.cnblogs.com/zhichaobouke/p/5798672.html (括号里的内容都是我主观添 ...

  6. Android技能杂谈——如何优雅的处理控件的点击事件

    首先分享一个最佳实践: 大家开发复杂一些的Android应用的时候常常会写一个BaseActivity或者BaseFragment,里面写上一些基本而公用的方法,比如监听网络状况.弹出对话框.设置ac ...

  7. Android Studio美化之优雅的logcat

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 先来个图,图样吐sexy: 很简单,跟我走吧,两步: 1. 引入Logger库 首先,这个sexy ...

  8. android 适配器 BaseAdapter 的学习

    昨天晚上看了下ArrayAdapter,和SimpleAdapter,今天早上起来看完了球赛,又继续要开始学习了,适配器除了前面的两种,还有一种常用的就是BaseAdapter,他是一个抽象类.事实上 ...

  9. [Android]对BaseAdapter中ViewHolder编写简化(转)

    来自博客:http://www.cnblogs.com/tiantianbyconan/p/3642849.html 在Android项目中,经常都会用到ListView这个控件,而相应的Adapte ...

随机推荐

  1. spring web项目下,判断项目是否启动完成

    本文同时发布于见鬼网:https://faceghost.com/article/483341 概述:spring 加载完成后,我们有时候会做一些初始化工作,如加载一些缓存,DB,等,这里采用实现Se ...

  2. Zookeeper和Chubby【分布式协调系统】

    前言(对于协调系统来说其客户端往往是分布式集群) 大规模分布式系统需要解决各种类型的协调需求: 当集群中有新的进程或服务器加入时,如何探测到它的加入?如何能够自动获取配置参数? 当配置信息被某个进程或 ...

  3. dict的操作和三级菜单

    dict的基本操作 # Author:nadech info = { "stu001":"sjp", "stu002":"cxx& ...

  4. Docker 数据卷

    数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在,直到没有容 ...

  5. Python3 File 方法

    Python3 File(文件) 方法 file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 序号 方法及描述 1 file.close() 关闭文件.关闭后文件不能再进行 ...

  6. Jeff Atwood倾情推荐——程序员必读之书

    英文版:<Code Complete 2>中文版:<代码大全(第二版)>作者:Steve McConnell译者:金戈  汤凌  陈硕  张菲出版社:电子工业出版社出版日期:2 ...

  7. ROS机器人程序设计(原书第2版)补充资料 (壹) 第一章 ROS系统入门

    ROS机器人程序设计(原书第2版)补充资料 (壹) 第一章 ROS系统入门 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第一章主要包括R ...

  8. FORM开发技术之动态控制某些item的属性

    利用FORM内置函数控制ITEM包括按钮,普通ITEM等等的属性,更多内置函数学习课参考我的博客FORM内置系统函数 http://blog.csdn.net/cai_xingyun/article/ ...

  9. 一个都不能少: DevOps的3大核心基础架构

    DevOps的涵盖面非常广,因为这个概念的火热,又有很多文章和技术都在把DevOps的帽子扣在自己头上,让很多人迷惑不解.其实,DevOps的知识体系如果从顶层上来分解,只有2块:方法论和工具链.方法 ...

  10. ORACLE数据库学习之数据库的优化

     数据库的优化 概述 影响数据库性能的因素包括:系统.数据库.网络. 数据库的优化包括:优化数据库磁盘I/O.优化回滚段.优化Rrdo日志.优化系统全局区.优化数据库对象. 监控数据库的性能: 在 ...