Adapter之自定义Adapter
前言:
在我们写程序是经常会用到适配器,当系统自带的适配器不够用时即可自己定义适配器
正文:
因为我们用到的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的更多相关文章
- Android中利用ViewHolder优化自定义Adapter的典型写法
利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...
- android代码优化----ListView中自定义adapter的封装(ListView的模板写法)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) .
今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAda ...
- Android ListView 自定义 Adapter
自定义Adapter类 public class ListViewAdapter extends BaseAdapter { private static final String TAG = Mai ...
- android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法
adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...
- 关于自定义adapter使用getApplicationContext()影响主题
最近弄了一个东西,listview+switch构成界面 关于android自定义adapter,继承自baseadapter,发现界面的switch开关主题变了想要的是浅色的主题,但是却发现变成了深 ...
- Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解
对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法.看看各位童鞋在平时的工作中否都用到了Al ...
- 【转】Android自定义Adapter的ListView的思路及代码
原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使 ...
- 关于自定义Adapter实现ListView的使用
以下为使用BaseAdapter作扩展,自定义Adapter来使用ListView控件: 需要注意以下的几点: 1.自定义Adapter时,需要特别注意Adapter类中getView()方法覆盖,注 ...
随机推荐
- Educational Codeforces Round 72 (Rated for Div. 2)C(暴力)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[200007];int a[20 ...
- Hot Module Replacement [热模块替换]
安装了webpack-dev-server后 , 配置 "start": "webpack-dev-server" 然后运行 npm start 会开起一个we ...
- PHP开发者该知道的5个Composer小技巧
Composer 是新一代的PHP依赖管理工具.本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便. 1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单 co ...
- 笔记||Pyhton3进阶之多线程原理
# 多线程 # 一个进程相当于一个或多个线程 # 当没有多线程编程时,一个进程也是一个主线程 # 但有多线程编程时,一个进程包含多个线程,包括主线程 # 使用线程 可以实现程序的并发 # python ...
- Using SmartAssembly with MSBuild
SmartAssembly 6 SmartAssembly 6 documentation Building your assembly Using SmartAssembly with MSBuil ...
- 中山DAy2——普及
今天挺不友好的,早上忘记定闹钟,晚了半小时起床,然后早上信心满满打算弄他个300分.结果……132.2分·.WTF??? T1:disease 题意:有n头奶牛,k种细菌(k<=15),给你每头 ...
- winform跳转到bs
private void button7_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("http ...
- JS实现深拷贝,浅拷贝的方法
在 JS 中,函数和对象都是浅拷贝(地址引用):其他的,例如布尔值.数字等基础数据类型都是深拷贝(值引用). 深拷贝 JSON.parse(JSON.stringify(src)):这种方法有局限性, ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:制作一个超小按钮
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Screen命令让Linux shell在后台运行
#screen ping ychack.com //挂置后台ping本站 #screen ping baidu.com //挂置后台ping百度 #screen -ls //列出进程 #screen ...