在安卓中,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的运行的更多相关文章

  1. Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item

    1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...

  2. Android:控件ListView列表项与适配器结合使用

    Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...

  3. listview当选中某一个item时设置背景色其他的不变

    listview当选中某一个item时设置背景色其他的不变: 可以使用listview.setOnFoucsChangeListener(listener) ; /** * listview获得焦点和 ...

  4. Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)

    1    MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...

  5. Android ListView根据项数的大小自动改变高度

    第一种:按照listview的项数确定高度 ListAdapter listAdapter = listView.getAdapter();      if (listAdapter == null) ...

  6. listview的pushBackDefaultItem中的item属性被修改问题

    time:2015/05/04 1. 描述 在cocostudio中有两个控件,一个listview,另外一个是隐藏的imageview,其中后者作为listview的元素.每次使用的时候把Image ...

  7. [转][Android] ListView中getView的原理+如何在ListView中放置多个item

      ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...

  8. 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 ...

  9. PyQt(Python+Qt)学习随笔:基于项的项部件(Item Widgets(Item-Based))概述

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Model/View架构中的视图部件是基于模型的项视图(Item Views(Model-Based ...

随机推荐

  1. git 合并子分支

    1.子分支 $ git status 位于分支 base 无文件要提交,干净的工作区 2.子分支更新 $ git pull origin base 来自 http://106.14.59.204/ji ...

  2. PHP上传文件时,文件过大$_FILES为空

    在php中判断上传文件的大小,但是文件一但过大,print_r($_FILES);的值就变为null了,有时候大家会遇到这么一个问题,上传小文件时,PHP能正常获取到,但是文件一超过8M就变为空了,我 ...

  3. Spring MVC 注解json 配置

    1.首先在pom.xml中添加依赖jar包 <dependency>        <groupId>org.codehaus.jackson</groupId>  ...

  4. 最基本PSO算法的C++实现

    按照James Kennedy & Russell Eberhart (1995)的版本,算法过程如下: [x*] = PSO() P = Particle_Initialization(); ...

  5. MFC中显示一张位图

    1.用类CBitmap加载位图 2.创建内存DC, 将位图选进此内存DC 3.调用BitBlt将内存DC的内容拷贝到其它DC(通知是显示DC) 例子(来自MSDN): // This OnDraw() ...

  6. liunx下解压压缩命令详细介绍

    Linux下的压缩解压缩命令详解及实例 实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip == ...

  7. cordova 使用H5混合开发APP

    cordova 中文官网 http://cordova.axuer.com/docs/zh-cn/latest/

  8. Mysql数据库--语句整理/提升/进阶/高级使用技巧

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  9. matlab 2017版本修改帮助文档为离线

    安装matlab2017a后发现,帮助文档为在线版本,必须关联账号. 经过查询资料,帮助文档默认是使用web, on mathworks.com 可以将帮助文档改为离线版本. 具体修改方法: Pref ...

  10. 1.6-1.8 HBase表的物理模型

    一.HBase 物理模型 1. 1.Table中的所有行都按照row key的字典序排列: 2.Table在行的方向上分割为多个Region: 3.Region按天小分割的,每个表开始只有一个regi ...