前言:

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

正文:

因为我们用到的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. nginx sendfile 相关知识

    https://blog.csdn.net/wm_1991/article/details/51916027

  2. 学习不一样的Vue1:环境搭建

    学习不一样的Vue1:环境搭建  发表于 2017-05-31 |  分类于 web前端|  |  阅读次数 11677 首先 首发博客: 我的博客 项目源码: 源码 项目预览: 预览 因为个人的喜好 ...

  3. python随机函数.2020.2.26

    随机生成函数: import random  //首先要引用random模板 print(random.randint(0,9))     //random的语法 random.randint(0,9 ...

  4. R语言 which() 、 which.min() 、 which.max() 函数

    函数 which() 可以用来找到满足条件的下标,如 x <- c(3, 4, 3, 5, 7, 5, 9) which(x > 5) 5 7 seq(along=x)[x > 5] ...

  5. 关于JDK+Tomcat+eclipse+MyEclipse的配置方法

    说一下关于JDK+Tomcat +eclipse+MyEclipse的配置方法: 1.jdk的配置 我用的是jdk1.6版本,与jdk1.5方法相同.执行完安装程序后就要在进行一下配置,步骤如下:右键 ...

  6. ardrino#串口控制led

    void setup() { pinMode(D6, OUTPUT); digitalWrite(D6,HIGH); Serial.begin(); } void loop() { String st ...

  7. JS中字符串的编码 解码

    DEPTNAME 是一个字符串 编码: DEPTNAME = encodeURI(encodeURI(DEPTNAME)); 解码: DEPTNAME = decodeURI(DEPTNAME,&qu ...

  8. sudo: gunicorn: command not found的问题

    在阿里云的ubantu云服务器上,python3 通过pip安装gunicorn 在命令行运行gunicorn时提示找不到命令 可以删除已经安装的gunicorn 解决办法: which pip #找 ...

  9. Java程序生成exe可执行文件

    Java程序打包成exe可执行文件,分为两大步骤. 第一步:将Java程序通过Eclipse或者Myeclipse导成Jar包 第二步:通过exe4j讲Jar包程序生成exe可执行文件 第一步详解: ...

  10. boost::timer demo

    #include <iostream> #include <boost/timer.hpp> //timer的头文件 using namespace boost; //打开bo ...