前言:

在我们写程序是经常会用到适配器,当系统自带的适配器不够用时即可自己定义适配器

正文:

因为我们用到的ListView视图所以我们先初始化ListView,在我们的主活动中添加如下代码

 <ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

下面直接来Java代码

 package com.example.administrator.testmyadapter;

 import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
private ListView lv;
private List<String>list;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.lv);
list=new ArrayList<String>();
for (int i=0;i<=40;i++){
list.add("数据"+i);
}
myAdapter=new MyAdapter();
lv.setAdapter(myAdapter);
}
class MyAdapter extends BaseAdapter{
@Override
//item的数量
public int getCount() {
return list.size();
} @Override
//item对象
public Object getItem(int position) {
return list.get(position);
} @Override
//item对象的id
public long getItemId(int position) {
return position;
} @Override
//获取每一个item的view视图
public View getView(int position, View convertView, ViewGroup parent) {
//获取布局映射器对象
LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
//将XML文件映射为view对象
View view=inflater.inflate(R.layout.my_item_activity,null);
//通过view对象找到控件
TextView textView=(TextView)view.findViewById(R.id.textview);
//赋值
textView.setText(list.get(position));
return view;
}
}
}

步骤二:

初始化ListView:黄色部分都是初始化ListView

步骤三:

初始化数据源:浅青色都是初始化数据源,常规操作不需要讲解

步骤四:

自定义适配器:1.添加名为MyAdapter的内部类 并且要继承BaseAdapter重写四个方法getCount(获取item数量)getItem(获取item对象)

        getItemId(获取Item对象id)getView(获取每一个item的view视图)

       2.通过LayoutInflater调用from方法获取布局映射器对象

       3.通过布局映射器对象调用inflate方法,使将XML文件映射为view对象

       4.通过view对象找到控件

       5.对找到的控件对象调用setText进行赋值

       6.返回view

问题:

上面写的内容在每次划出新的item时会再次实例化对象,这样就会耗费大量的时间

这一次我们使用convertView,这样我们在滑到哟个新的item时会把之前滑出屏幕的item进行复用

来代码:

 public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if(convertView==null){
convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.my_item_activity,null);
holder=new Holder();
holder.tv=(TextView)convertView.findViewById(R.id.textview);
//打标签
convertView.setTag(holder);
}else {
//进行复用
holder=(Holder)convertView.getTag();
}
holder.tv.setText(list.get(position));
return convertView;
}
class Holder{
TextView tv;
}

在这些代码中仍然是在getView方法中进行操作,并再次添加一个内部类Holder,并且类中添加复用的控件

在getView方法中首先是一个判断,if是在第一次进入程序中创建的,而且如果屏幕中显示n个item则创建n+1个

第四行代码是通过布局映射器把XML文件映射为convertView对象,然后让复用标签和给定标签进行关联

打标签就是为了让方便取出convertView中需要赋值的控件

在else中getTag课取出打进去的标签

getView返回值是convertView

Adapter之自定义Adapter的更多相关文章

  1. Android中利用ViewHolder优化自定义Adapter的典型写法

    利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...

  2. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) .

    今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAda ...

  4. Android ListView 自定义 Adapter

    自定义Adapter类 public class ListViewAdapter extends BaseAdapter { private static final String TAG = Mai ...

  5. android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

    adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...

  6. 关于自定义adapter使用getApplicationContext()影响主题

    最近弄了一个东西,listview+switch构成界面 关于android自定义adapter,继承自baseadapter,发现界面的switch开关主题变了想要的是浅色的主题,但是却发现变成了深 ...

  7. Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解

    对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法.看看各位童鞋在平时的工作中否都用到了Al ...

  8. 【转】Android自定义Adapter的ListView的思路及代码

    原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下   在开发中,我们经常使 ...

  9. 关于自定义Adapter实现ListView的使用

    以下为使用BaseAdapter作扩展,自定义Adapter来使用ListView控件: 需要注意以下的几点: 1.自定义Adapter时,需要特别注意Adapter类中getView()方法覆盖,注 ...

随机推荐

  1. vmware 因误删Linux 虚拟机磁盘,无法启动处理方法

    有可能我们在做了以下误操作,导致Linux系统无法启动: 1). 磁盘损坏或虚拟机磁盘被我们删除了,而fstab文件没有更新: 2). 由于误操作或其它原因使动态库错误. 1. 首先准备好系统安装盘, ...

  2. R语言 table()函数

    table函数 用 table() 函数统计因子各水平的出现次数(称为频数或频率).也可以对一般的向量统计每个不同元素的出现次数.如 sex = c("女","女&quo ...

  3. CS231n -Assignments 1 Q1 and Q2

    前言 最近在youtube 上学习CS231n的课程,并尝试完成Assgnments,收获很多,这里记录下过程和结果以及过程中遇到的问题,我并不是只是完成需要补充的代码段,对于自己不熟悉的没用过的库函 ...

  4. 「SPOJ1487」Query on a tree III

    「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ...

  5. 科软-信息安全实验2-netfilter实验

    目录 一 前言 二 Talk is cheap, show me the code 三 前期准备 四 效果演示 五 遇到的问题&解决 六 参考资料 七 老师提供的代码 一 前言 文章不讲解理论 ...

  6. mybatis动态参数查询

    参考:https://blog.csdn.net/zbw18297786698/article/details/53727594

  7. matplotlib画图的时候显示不出中文和负号的解决办法

    import matplotlib.pyplot as pltfrom pylab import * plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中 ...

  8. (转)spring mvc 中文乱码问题解决

    在eclipse环境里,页面传输数据的时候通常用ISO-8859-1这个字符集可以用 str = new String(str.getBytes("ISO-8859-1"), &q ...

  9. 浅谈Spring发展史

    1 码农的春天----------Spring来了 Spring官网 :http://www.springframework.org 关于Spring的发展起源要回溯到2002年,当时正是Java E ...

  10. 运行自己的 DaemonSet【转】

    本节以 Prometheus Node Exporter 为例演示如何运行自己的 DaemonSet. Prometheus 是流行的系统监控方案,Node Exporter 是 Prometheus ...