安卓Listview 不规则项即不同item的运行
在安卓中,listview 的item 是一个不断被轮询调换位置的过程,这样
即
图片参考地址 http://www.cnblogs.com/mybkn/archive/2012/05/23/2514681.html 谢谢。
开发中 ,我们经藏会遇到listview 的每一项都不同的需求。 这个时候如果使用 以前自定义的BaseAdapter的方法的话 。在滚动的时候就会出现item布局错乱的情况,也就是说 第一项在最初的背景是红色的xml布局, 当滚动到第二项置顶,在回到顶部的时候, 顶部的项布局可能就不是最初的样子了。

这种情况, 如果依然按照原先的方式的话, 当刚滑动至第一项消失,就会把第一项拿到底部。
但是如果实现下面方法 ,系统在你滑动de 时候就会判定,当前第一项消失的类型,并不是我要填充的类型就不会把他从第一行拿掉,去填充尾部,而是调用getview 告诉listview 要添加的项 view是空的 ,你去重新new个新的吧。
当返回顶部的时候,系统再次判断,即将显示的类型斌不是我底部的类型,就不会吧底部的项移到前面 ,而是复用刚刚的那个。
怎么才能解决这个问题呢
我们需要做这些工作:
1)重写 getViewTypeCount() – 该方法返回多少个不同的布局
2)重写 getItemViewType(int) – 根据position返回相应的Item
3)根据view item的类型,在getView中创建正确的convertView
private RunRankAdapter runRankAdapter;
public ArrayList<View> listViews ;
public ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Gson gson = new Gson(); ArrayList<String> runRank=new ArrayList<String>();
for(int i =;i<;i++)
{
runRank.add("dsdf");
} ListView lv_runRank; runRankAdapter = new RunRankAdapter(this, runRank);
lv_runRank = (ListView) findViewById(R.id.listView1);
lv_runRank.setAdapter(runRankAdapter);
class RunRankAdapter extends BaseAdapter {
ArrayList<String> ls;
Context mContext;
LinearLayout linearLayout = null;
LayoutInflater inflater;
TextView tex;
final int VIEW_TYPE = ;
final int TYPE_1 = ;
final int TYPE_2 = ;
final int TYPE_3 = ;
public RunRankAdapter(Context context,
ArrayList<String> list) {
ls = list;
mContext = context;
}
@Override
public int getCount() {
return ls.size();
}
@Override
public Object getItem(int position) {
return ls.get(position);
}
@Override
public long getItemId(int position) {
return ;
}
// 每个convert view都会调用此方法,获得当前所需要的view样式
@Override
public int getItemViewType(int position) {
int p = position;
if (p == )
return TYPE_1;
else if (p == )
return TYPE_2;
else
return TYPE_3;
}
@Override
public int getViewTypeCount() {
return ;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
ViewHolder3 holder3 = null;
int type = getItemViewType(position);
if (convertView == null) {
inflater = LayoutInflater.from(mContext);
// 按当前所需的样式,确定new的布局
switch (type) {
case TYPE_1:
convertView = inflater.inflate(R.layout.item_one,
parent, false);
// holder1 = new ViewHolder1();
// holder1.rank1 = (TextView) convertView
// .findViewById(R.id.tv_list1_rank);
// holder1.time1 = (TextView) convertView
// .findViewById(R.id.tv_list1_time);
// convertView.setTag(holder1);
break;
case TYPE_2:
convertView = inflater.inflate(R.layout.item_two,
parent, false);
// holder2 = new ViewHolder2();
// holder2.rank2 = (TextView) convertView
// .findViewById(R.id.tv_list2_rank);
// holder2.time2 = (TextView) convertView
// .findViewById(R.id.tv_list2_time);
// convertView.setTag(holder2);
break;
case TYPE_3:
convertView = inflater.inflate(R.layout.item_3,
parent, false);
// holder3 = new ViewHolder3();
// holder3.rank3 = (TextView) convertView
// .findViewById(R.id.tv_list3_rank);
// holder3.time3 = (TextView) convertView
// .findViewById(R.id.tv_list3_time);
// convertView.setTag(holder3);
break;
default:
break;
}
} else {
// switch (type) {
// case TYPE_1:
// holder1 = (ViewHolder1) convertView.getTag();
// break;
// case TYPE_2:
// holder2 = (ViewHolder2) convertView.getTag();
// break;
// case TYPE_3:
// holder3 = (ViewHolder3) convertView.getTag();
// break;
// }
}
// 设置资源
// switch (type) {
// case TYPE_1:
// holder1.rank1.setText("" + (position + 1));
// holder1.time1.setText(ls.get(position).get("time").toString());
// break;
// case TYPE_2:
// holder2.rank2.setText("" + (position + 1));
// holder2.time2.setText(ls.get(position).get("time").toString());
// holder2.totaldistance2.setText(ls.get(position)
// break;
// case TYPE_3:
// holder3.rank3.setText("" + (position + 1));
// holder3.time3.setText(ls.get(position).get("time").toString());
// break;
// }
return convertView;
}
public class ViewHolder1 {
TextView rank1;
TextView time1;
}
public class ViewHolder2 {
TextView rank2;
TextView time2;
}
public class ViewHolder3 {
TextView rank3;
TextView time3;
}
}
适配器
安卓Listview 不规则项即不同item的运行的更多相关文章
- Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item
1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...
- Android:控件ListView列表项与适配器结合使用
Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...
- listview当选中某一个item时设置背景色其他的不变
listview当选中某一个item时设置背景色其他的不变: 可以使用listview.setOnFoucsChangeListener(listener) ; /** * listview获得焦点和 ...
- Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)
1 MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...
- Android ListView根据项数的大小自动改变高度
第一种:按照listview的项数确定高度 ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) ...
- listview的pushBackDefaultItem中的item属性被修改问题
time:2015/05/04 1. 描述 在cocostudio中有两个控件,一个listview,另外一个是隐藏的imageview,其中后者作为listview的元素.每次使用的时候把Image ...
- [转][Android] ListView中getView的原理+如何在ListView中放置多个item
ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...
- System.ArgumentException: 已添加了具有相同键的项。(An item with the same key has already been added) 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 在 System.Web.Mvc.Js
最近将一个项目从ASP.NET MVC 3升级至刚刚发布的ASP.NET MVC 5.1,升级后发现一个ajax请求出现了500错误,日志中记录的详细异常信息如下: System.ArgumentEx ...
- PyQt(Python+Qt)学习随笔:基于项的项部件(Item Widgets(Item-Based))概述
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Model/View架构中的视图部件是基于模型的项视图(Item Views(Model-Based ...
随机推荐
- Linux常用命令之scp
目录 1.拷贝远程文件到本地 2.拷贝远程文件夹到本地 3.拷贝本地文件到远程 4.拷贝本地文件夹到远程 1.拷贝远程文件到本地 scp root@101.132.169.194:/home/wwwr ...
- html5--3.19 新增的progress/meter元素
html5--3.19 新增的progress/meter元素 学习要点 了解progress/meter元素的用法 progress元素 是HTML5中新增的元素,用来建立一个进度条 通常与Java ...
- 2016.4.23浙江省赛(zoj3936 zoj3938 zoj3940 zoj3944 zoj3946 zoj3947 )
A Apples and Ideas Time Limit: 2 Seconds Memory Limit: 65536 KB "If you have an apple ...
- 关于「环境变量」PATH,CLASSPATH
以前在Windows中配置Java环境变量的时候初次遇到要配置环境变量,当时并不知道那是干什么用的,只知道配置了之后,在任何一个文件夹都可以使用"javac"命令来编译java文件 ...
- node.js版本管理(Win) --- nvm-window
目录 1. 安装 2. 使用 1. 安装 去往Git链接:https://github.com/coreybutler/nvm-windows. 点击下载链接: 选择第一个nvm-noinstall. ...
- docker 学习(五) virtualBox虚拟机安装docker
这里计划用virtualBox虚拟机安装两个ubuntu servers, 然后用docker把spring boot项目部署上去,模拟一下分布式的微服务情况. 1:安装virtualbox,后安装U ...
- bzoj3680
$模拟退火$ $这种全局最优的问题用模拟退火$ $模拟退火就是每次向四周随机移动,移动的幅度和温度成正比,如果新的位置更优就接受,否则按一定概率接收,概率和温度成正比$ $最后稳定后再在最优解附近蹦跶 ...
- Flutter实战视频-移动电商-21.分类页_类别信息接口调试
21.分类页_类别信息接口调试 先解决一个坑 取消上面的GridVIew的回弹效果.就是在拖这个gridview的时候有一个滚动的效果 physics: NeverScrollableScrollPh ...
- TP5实现签到功能
基于tp5 模型的一个签到功能: 由于存储所有的签到日期数据库会非常庞大,所以签到日期只存储近三个月的. 具体功能: 1.记录最近一次的签到时间 2.每次签到都会添加15积分 3.有连续签到的记录 C ...
- LightOJ1197【数学】
引自:WONTER 题意: 给你两个数,a,b,让你求区间[a,b]里面有多少个素数: 思路: 首先要知道,我们要想筛 [1, b] 中所有的素数,只需要用到 [1, sqrt(b)] 中的所有素数来 ...