前言:

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

正文:

因为我们用到的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. DAC

    DAC的功能:可以输出电压(无触发,设置DAC转换值,DAC使能更新寄存器和启动转换)或者波形(连续转换,用DMA发送数据,定时器触发).首先有个正弦波波形的数组,内存到DAC的DMA通道不断的将正弦 ...

  2. listenTo - backbone.js

    listenToobject.listenTo(other, event, callback) 让 object 监听 另一个(other)对象上的一个特定事件.不使用other.on(event, ...

  3. 「BJOI2018」求和

    「BJOI2018」求和 传送门 观察到 \(k\) 很小而且模数不会变,所以我们直接预处理 \(k\) 取所有值时树上前缀答案,查询的时候差分一下即可. 参考代码: #include <alg ...

  4. 「CH6202」黑暗城堡

    「CH6202」黑暗城堡 传送门 这道题是要让我们求以点 \(1\) 为源点的最短路树的方案数. 我们先跑一遍最短路,然后考虑类似 \(\text{Prim}\) 的过程. 当我们把点 \(x\) 加 ...

  5. Ubuntu操作基本快捷键

    * 打开主菜单 = Alt + F1* 运行 = Alt + F2* 显示桌面 = Ctrl + Alt + d* 最小化当前窗口 = Alt + F9* 最大化当前窗口 = Alt + F10* 关 ...

  6. jeDate日期控件精确到秒

    案例下载 链接: https://pan.baidu.com/s/1m7eEW6K6Bt1t-0OjVY_Wxw 密码: xmei <script type="text/javascr ...

  7. APIView 的请求生命周期

    目录 APIView 的请求生命周期 请求解析模块 响应渲染模块 序列化组件 Django 配置 """ 1)应用是否需要在INSTALLED_APPS中注册 在没有使用 ...

  8. JS监听手机物理返回键,返回到指定页面

    pushHistory(); window.addEventListener("popstate", function(e) { window.location = data.in ...

  9. 常用mac/unix/linux命令

    1.查询ip地址 ifconfig 2.查找服务器上应用程序的端口分配 grep telnet /etc/services (telnet) telnet使用TCP/UDP端口号23 grep dom ...

  10. C# 篇基础知识2——运算符、类型转换、流程控制、枚举、结构体和数组、函数

    1.运算符.类型转换 计算某年y某月m某日d是周几的基姆拉尔森公式公式:int week = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) ...