浅析android适配器adapter中的那些坑
做项目中遇到的,折磨了我将近两天,今天把经验分享出来。让大家以后少走点弯路,好了。简单来说一下什么是android的适配器,怎样定义。怎样添加适配器的重用性。怎样去减少程序的耦合性
适配器顾名思义是用来做适配的,可是他是怎样做适配的。机制是什么。作用是什么,好,相信写java的都是知道什么是面向对象编程吧,这里用面向对象来解释非常好理解。事实上适配器是把每一个对象放在其空间上然后在andorid页面显示,如今再来理解,对象事实上就是数据的抽象体吧,而页面显示通常是xml也就是视图吧,那么数据以视图的形式来显示,那么这就是adapter起的作用,并且他能够让其依照对应的顺序显示,能够依据对应的操作来进行数据或者页面的操作,那么来看一下我的适配器,上代码
这个是bean实体
package com.example.fanyafeng.laugh.bean; import com.example.fanyafeng.laugh.util.S; /**
* Created by fanyafeng on 2015/6/30.
*/
public class IndexListViewBean extends BaseBean {
private String Title;
private String LeftTopImg;
private String LeftTopTitle;
private String LeftTopTimes;
private String LeftTopUrl;
private String RightTopImg;
private String RightTopTitle;
private String RightTopTimes;
private String RightTopUrl;
private String LeftBottomImg;
private String LeftBottomTitle;
private String LeftBottomTimes;
private String LeftBottonUrl;
private String RightBottomImg;
private String RightBottomTitle;
private String RightBottomTimes;
private String RightBottonUrl; public IndexListViewBean(String title, String leftTopImg, String leftTopTitle, String leftTopTimes, String leftTopUrl, String rightTopImg, String rightTopTitle, String rightTopTimes, String rightTopUrl, String leftBottomImg, String leftBottomTitle, String leftBottomTimes, String leftBottonUrl, String rightBottomImg, String rightBottomTitle, String rightBottomTimes, String rightBottonUrl) {
Title = title;
LeftTopImg = leftTopImg;
LeftTopTitle = leftTopTitle;
LeftTopTimes = leftTopTimes;
LeftTopUrl = leftTopUrl;
RightTopImg = rightTopImg;
RightTopTitle = rightTopTitle;
RightTopTimes = rightTopTimes;
RightTopUrl = rightTopUrl;
LeftBottomImg = leftBottomImg;
LeftBottomTitle = leftBottomTitle;
LeftBottomTimes = leftBottomTimes;
LeftBottonUrl = leftBottonUrl;
RightBottomImg = rightBottomImg;
RightBottomTitle = rightBottomTitle;
RightBottomTimes = rightBottomTimes;
RightBottonUrl = rightBottonUrl;
} public String getTitle() {
return Title;
} public void setTitle(String title) {
Title = title;
} public String getLeftTopImg() {
return LeftTopImg;
} public void setLeftTopImg(String leftTopImg) {
LeftTopImg = leftTopImg;
} public String getLeftTopTitle() {
return LeftTopTitle;
} public void setLeftTopTitle(String leftTopTitle) {
LeftTopTitle = leftTopTitle;
} public String getLeftTopTimes() {
return LeftTopTimes;
} public void setLeftTopTimes(String leftTopTimes) {
LeftTopTimes = leftTopTimes;
} public String getLeftTopUrl() {
return LeftTopUrl;
} public void setLeftTopUrl(String leftTopUrl) {
LeftTopUrl = leftTopUrl;
} public String getRightTopImg() {
return RightTopImg;
} public void setRightTopImg(String rightTopImg) {
RightTopImg = rightTopImg;
} public String getRightTopTitle() {
return RightTopTitle;
} public void setRightTopTitle(String rightTopTitle) {
RightTopTitle = rightTopTitle;
} public String getRightTopTimes() {
return RightTopTimes;
} public void setRightTopTimes(String rightTopTimes) {
RightTopTimes = rightTopTimes;
} public String getRightTopUrl() {
return RightTopUrl;
} public void setRightTopUrl(String rightTopUrl) {
RightTopUrl = rightTopUrl;
} public String getLeftBottomImg() {
return LeftBottomImg;
} public void setLeftBottomImg(String leftBottomImg) {
LeftBottomImg = leftBottomImg;
} public String getLeftBottomTitle() {
return LeftBottomTitle;
} public void setLeftBottomTitle(String leftBottomTitle) {
LeftBottomTitle = leftBottomTitle;
} public String getLeftBottomTimes() {
return LeftBottomTimes;
} public void setLeftBottomTimes(String leftBottomTimes) {
LeftBottomTimes = leftBottomTimes;
} public String getLeftBottonUrl() {
return LeftBottonUrl;
} public void setLeftBottonUrl(String leftBottonUrl) {
LeftBottonUrl = leftBottonUrl;
} public String getRightBottomImg() {
return RightBottomImg;
} public void setRightBottomImg(String rightBottomImg) {
RightBottomImg = rightBottomImg;
} public String getRightBottomTitle() {
return RightBottomTitle;
} public void setRightBottomTitle(String rightBottomTitle) {
RightBottomTitle = rightBottomTitle;
} public String getRightBottomTimes() {
return RightBottomTimes;
} public void setRightBottomTimes(String rightBottomTimes) {
RightBottomTimes = rightBottomTimes;
} public String getRightBottonUrl() {
return RightBottonUrl;
} public void setRightBottonUrl(String rightBottonUrl) {
RightBottonUrl = rightBottonUrl;
} @Override
public String toString() {
return "IndexListViewBean{" +
"Title='" + Title + '\'' +
", LeftTopImg='" + LeftTopImg + '\'' +
", LeftTopTitle='" + LeftTopTitle + '\'' +
", LeftTopTimes='" + LeftTopTimes + '\'' +
", LeftTopUrl='" + LeftTopUrl + '\'' +
", RightTopImg='" + RightTopImg + '\'' +
", RightTopTitle='" + RightTopTitle + '\'' +
", RightTopTimes='" + RightTopTimes + '\'' +
", RightTopUrl='" + RightTopUrl + '\'' +
", LeftBottomImg='" + LeftBottomImg + '\'' +
", LeftBottomTitle='" + LeftBottomTitle + '\'' +
", LeftBottomTimes='" + LeftBottomTimes + '\'' +
", LeftBottonUrl='" + LeftBottonUrl + '\'' +
", RightBottomImg='" + RightBottomImg + '\'' +
", RightBottomTitle='" + RightBottomTitle + '\'' +
", RightBottomTimes='" + RightBottomTimes + '\'' +
", RightBottonUrl='" + RightBottonUrl + '\'' +
'}';
}
}
这个是适配器
package com.example.fanyafeng.laugh.adapter; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.v4.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import com.example.fanyafeng.laugh.R;
import com.example.fanyafeng.laugh.activity.VideoDisplayActivity;
import com.example.fanyafeng.laugh.activity.VideoListActivity;
import com.example.fanyafeng.laugh.activity.VideoViewPlayingActivity;
import com.example.fanyafeng.laugh.bean.IndexListViewBean;
import com.example.fanyafeng.laugh.bean.IndexUrlBean;
import com.example.fanyafeng.laugh.util.ImageLoaderCache;
import com.example.fanyafeng.laugh.util.L;
import com.example.fanyafeng.laugh.util.ListViewImageTaskUtil;
import com.example.fanyafeng.laugh.util.StringTools;
import com.example.fanyafeng.laugh.util.SyncImageLoader; import java.util.List; /**
* Created by fanyafeng on 2015/7/1.
*/
public class IndexListViewAdapter extends BaseAdapter { private Context context;
private List<IndexListViewBean> indexListViewBeans;
private ListView listView; //缓存到本地sd卡,并且能够更新ListView图片
private ImageLoaderCache mImageLoader; // 获取当前应用程序所分配的最大内存
private final int maxMemory = (int) Runtime.getRuntime().maxMemory();
// 只用五分之中的一个用来做图片缓存
private final int cacheSize = maxMemory / 5; private LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>(
cacheSize) { // 重写sizeof()方法
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// TODO Auto-generated method stub
// 这里用多少kb来计算
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
} }; public IndexListViewAdapter(Context context, List<IndexListViewBean> indexListViewBeans) {
this.context = context;
this.indexListViewBeans = indexListViewBeans;
mImageLoader = new ImageLoaderCache(context);
} public ImageLoaderCache getImagerLoader() {
return mImageLoader;
} public void update() {
notifyDataSetChanged();
} @Override
public int getCount() {
return indexListViewBeans.size();
} @Override
public Object getItem(int position) {
return indexListViewBeans.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(final int position, View convertView, final ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.item_fragment_homepage, null);
holder = new ViewHolder();
view.setTag(holder);
holder.Title = (TextView) view.findViewById(R.id.index_title);
holder.LeftTopImg = (ImageView) view.findViewById(R.id.index_left_up_iv);
holder.LeftTopTitle = (TextView) view.findViewById(R.id.index_left_up_tv);
holder.LeftTopTimes = (TextView) view.findViewById(R.id.index_left_up_time);
holder.RightTopImg = (ImageView) view.findViewById(R.id.index_right_up_iv);
holder.RightTopTitle = (TextView) view.findViewById(R.id.index_right_up_tv);
holder.RightTopTimes = (TextView) view.findViewById(R.id.index_right_up_time);
holder.LeftBottomImg = (ImageView) view.findViewById(R.id.index_left_down_iv);
holder.LeftBottomTitle = (TextView) view.findViewById(R.id.index_left_down_tv);
holder.LeftBottomTimes = (TextView) view.findViewById(R.id.index_left_down_time);
holder.RightBottomImg = (ImageView) view.findViewById(R.id.index_right_down_iv);
holder.RightBottomTitle = (TextView) view.findViewById(R.id.index_right_down_tv);
holder.RightBottomTimes = (TextView) view.findViewById(R.id.index_right_down_time); } else {
holder = (ViewHolder) view.getTag();
} holder.LeftTopImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getLeftTopUrl());
L.d("leftTopUrl", indexListViewBeans.get(position).getLeftTopUrl());
L.d("点击获取的位置", position);
context.startActivity(intent);
}
});
holder.RightTopImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getRightTopUrl());
context.startActivity(intent);
}
});
holder.LeftBottomImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getLeftBottonUrl());
context.startActivity(intent);
}
});
holder.RightBottomImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getRightBottonUrl());
context.startActivity(intent);
}
});
holder.Title.setText(indexListViewBeans.get(position).getTitle());
holder.LeftTopTitle.setText(indexListViewBeans.get(position).getLeftTopTitle());
holder.LeftTopTimes.setText(indexListViewBeans.get(position).getLeftTopTimes());
holder.RightTopTitle.setText(indexListViewBeans.get(position).getRightTopTitle());
holder.RightTopTimes.setText(indexListViewBeans.get(position).getRightTopTimes());
holder.LeftBottomTitle.setText(indexListViewBeans.get(position).getLeftBottomTitle());
holder.LeftBottomTimes.setText(indexListViewBeans.get(position).getLeftBottomTimes());
holder.RightBottomTitle.setText(indexListViewBeans.get(position).getRightBottomTitle());
holder.RightBottomTimes.setText(indexListViewBeans.get(position).getRightBottomTimes());
loadBitmap(indexListViewBeans.get(position).getLeftTopImg(), holder.LeftTopImg);
loadBitmap(indexListViewBeans.get(position).getRightTopImg(), holder.RightTopImg);
loadBitmap(indexListViewBeans.get(position).getLeftBottomImg(), holder.LeftBottomImg);
loadBitmap(indexListViewBeans.get(position).getRightBottomImg(), holder.RightBottomImg); return view;
} private void loadBitmap(String urlStr, ImageView image) { ListViewImageTaskUtil asyncLoader = new ListViewImageTaskUtil(image, mLruCache);// 一个异步图片载入对象
Bitmap bitmap = asyncLoader.getBitmapFromMemoryCache(urlStr);// 首先从内存缓存中获取图片
if (bitmap != null) {
image.setImageBitmap(bitmap);// 假设缓存中存在这张图片则直接设置给ImageView
} else {
image.setImageResource(R.drawable.wait);// 否则先设置成默认的图片
asyncLoader.execute(urlStr);// 然后运行异步任务AsycnTask 去网上载入图片
}
} static class ViewHolder {
TextView Title;
ImageView LeftTopImg;
TextView LeftTopTitle;
TextView LeftTopTimes;
ImageView RightTopImg;
TextView RightTopTitle;
TextView RightTopTimes;
ImageView LeftBottomImg;
TextView LeftBottomTitle;
TextView LeftBottomTimes;
ImageView RightBottomImg;
TextView RightBottomTitle;
TextView RightBottomTimes;
}
}
重点在实体的书写和适配器的书写,那么如今我实体的定义不不过用来去用数据来映射视图,另一个非常重要的是在对象上set数据,单个的item再去取,原来博主没有将每一个对象里面的四个链接相应的bean实体中,而是用的全局变量(把activity或者fragment和adapter写在一起,这样写不好。至于为什么我这里简单会所一下,详细的大家去体会,首先就是代码会非常乱,再有就是adapter的复用,还有就是全局变量多的话一个是不好维护一个是效率会低,剩下的真得自己去理解了)的list数据,想依据getview中的position去找相应的链接,可是通过抓position我发现,他不和onitemonclick(这里面的position是依次累加的。并且是唯一的)里的position一样。这里面我设置的是每次载入三个,然后上拉载入很多其它再载入三个。这种话,我打印出来的position是0到2的一直的死循环,这样问题就来了,得到的相应的链接肯定不正确。由于是依照getview的position来获取的,那么,咱再向深层次想一下。android的getview的机制是什么,为什么listview控件上的数据的相应关系并没有错,也没有乱,这个就涉及到面试官常常问的面试题了,有的会问listview怎样优化,看的一些资料说是settag。对。这是,并且是一般网络上的答案(可是这个我感觉回答优化不是非常好,是在adapter怎样进行处理事务,怎么去处理,这个方向才应该是对的)。可是这个settag恰恰是我们的问题所在,由于谷歌给的listview是假设这个view划出屏幕以后。那么谷歌会给你处理。这个存在的view假设再划回来。出如今屏幕上,那么这时候settag開始起作用了,换句话说就是if那。開始运行else了。
博主处理的时候刚開始用了一个全局的list,可是这样一个是不好,还有一个没有达到要的效果,然后博主又開始想还有一个方法就是java的面向对象里面设置bean,好,原来博主是在adapter又定义了全局的变量,在if else之外获取。可是onclickerlistener在if else之内,这种话,相当远博主上文说道的那个,运行那个的问题。这种话进行屏幕的滑动和刷新里面的全局的数据肯定会乱,一定会乱。这时候。再往深层次去挖,就到了上面说的那个了,就是要在绑定数据那里去进行事件的监听,并且去获取对应的数据,这种话就能够得到想要的效果。并且view的显示也都是这么做的。没有乱
这里说一下adapter是怎样将数据映射到xml,一般的话都是先去写一个holder。里面都是item的xml所须要的东西,然后再在这里面去找layout,然后再去找相应的id。然后再去和holder里面去相应(相应bean里面定义的。通常是须要进行页面显示的,而数据的后台操作是不用去相应相应的布局id), 还有这里着重强调一下adapter里面的一些坑
getview的position是固定的几个值,相对的,不要去当全局变量去使用
注意adapter开启一个activity等等
监听事件不要去写在ifelse结构体里面,事件处理也是一样,放在外面单独处理
注意耦合,否则代码会乱,依照道理说程序猿的逻辑思维应该是非常清晰的。总有一条思路可以让你去进行解耦。可是哪一条好。并且适合你的处理方式方法。这一点就须要程序猿的经验了,剩下的靠大家去体验了,这里仅仅是浅析
浅析android适配器adapter中的那些坑的更多相关文章
- Android 自定义Adapter中实现startActivityForResult的分析
最近几天在做文件上传的时候,想在自定义Adapter中启动activity时也返回Intent数据,于是想到了用startActivityForResult,可是用mContext怎么也调不出这个方法 ...
- Android适配器Adapter学习
在开发中我们需要绑定一些数据展现到桌面上,这是就需要AdapterView.AdapterView是ViewGroup的子类,它决定了怎么展现视图通过Adapter来绑定特殊的数据类型. Adapte ...
- android适配器Adapter
一.什么是适配器,适配器有什么用? 适配器是AdapterView视图(如ListView - 列表视图控件.Gallery - 缩略图浏览器控件.GridView - 网格控件.Spinner - ...
- Android适配器Adapter的学习
Android中有很多的适配器,首先看看这些适配器的继承结构 这些适配器中,BaseAdapter用的最多,也用的最熟,先放过他,从ArrayAdapter开始 一个listAdapter用来管理一个 ...
- 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...
- Android学习之在Adapter中调用Fragment
•前言 在学习<第一行代码>,4.5 小节--一个简易版的新闻应用的时候: 在为 RecyclerView 创建适配器的时候: 作者直接在 NewsTitleFragment.java 中 ...
- android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法
adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...
- android开发过程中遇到的坑
在android的学习过程中,会有很多坑,我会把我遇到的,一一列下来,方便后来者查阅! 1:android-support-v4.jar and android-support-v7-appcompa ...
- [Android] Android Butterknife 8.8.1 在 Activity 和 Fragment 、 Adapter 中的使用
ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神JakeW ...
随机推荐
- .net framework 3.5 安装报错 0x800F0954问题
windows Server 2019 .net framework 3.5 安装报错 0x800F0954问题 .net framework 3.5的安装教程:但是安装出现0x800F0954这个错 ...
- 在Swift中,如何像Objective-C定义可选接口?
Objective-C中的protocol里存在@optional关键字,被这个关键字修饰的方法并非必须要被实现.我们可以通过接口定义一系列方法,然后由实现接口的类选择性地实现其中几个方法.在Coco ...
- eclipse 安装svn插件记录
每个人都有自己喜欢的和习惯的一套开发环境,其中对于喜欢用eclipse的同学来说.subclipse插件可以说是必不可少的插件了. 他的安装有两种方法,一种是在线安装.然而这种安装实在是太慢了,无法忍 ...
- node.js安装步骤
首先这是node.js的官网:https://nodejs.org/en/ 截至2017年12月9日,node更新在8.9.3该版本,建议开发人员下载6.0以上版本,8以上不是很稳定! 如果有其他需 ...
- SV creation order
SystemVerilog Instance Worlds When generating an UVM testbench and in particular the DUT - testbench ...
- 使用Jupter Notebook实现简单的神经网络
参考:http://python.jobbole.com/82208/ 注:1)# %matplotlib inline 注解可以使Jupyter中显示图片 2)注意包的导入方式 一.使用的Pytho ...
- html5——多媒体(三)
自定义进度条 1.video标签是内联块,可以设置宽高,但是需要用大盒子将其包裹起来进行定位 2.小盒子设计成进度条样式,并进行定位 3.进度条样式中的特殊按钮可以用web字体 4.通过点击实现视频的 ...
- JS——筋斗云案例
需求: 1.鼠标移动到哪里,云彩移动到哪里 2.鼠标离开,云彩回到原点 3.鼠标离开,云彩回到之前点击的地方 <!DOCTYPE html> <html lang="en& ...
- 转载:使用FileReader对象的readAsDataURL方法来读取图像文件
文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...
- Python标准库sys
1.命令行参数sys.argv 我们从Python语言之模块第一部分的例子开始,看看sys.argv中到底存了些什么内容. #Filename: using_sys.py import sys i=0 ...