在安卓中,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. reactjs的一些笔记

    1.使用虚拟DOM作为其不同的实现.同时可以由服务器node.js渲染,从而不需要过重的浏览器DOM支持.   2.虚拟DOM:在浏览器端用javascript实现了一套DOM API.用react开 ...

  2. codeforces 669B B. Little Artem and Grasshopper(水题)

    题目链接: B. Little Artem and Grasshopper time limit per test 2 seconds memory limit per test 256 megaby ...

  3. TCPDUMP 使用详情

    第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一 ...

  4. 使用 WinSCP(下载) 上文件到 Linux图文教程

        问题导读: 1.如何远程链接? 2.如何上传文件? 3.如何对立面的文件进行操作? 4.什么情况下会链接失败? https://yunpan.cn/cYWtNMycjeVPv 访问密码 4f7 ...

  5. [APIO 2017] 商旅

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5367 [算法] 很明显的分数规划问题 预处理从一个点走到另一个点所获最大利润和最短路 ...

  6. Linux串口通信中一种接收不到数据的问题的解决

    转载来源:嵌入式系统之初学者点滴 (百度空间) 原文 在这篇文章()中,实现了Linux环境下的串口读写操作,程序也运行成功了.但是再进一步测试时发现,如果开机之后直接如上文中所说,分别运行读程序和写 ...

  7. 禁用ubuntu 客人会话

    sudo vi /usr/share/lightdm/lightdm.conf.d/50-guest-wrapper.conf 添加: allow-guest=false 重启.

  8. HDU2190

    悼念512汶川大地震遇难同胞——重建希望小学 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. 使用Bootstrap模态框实现增删改查功能

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 本文实现的是使用模态框实现简单的增删改查的功能. ...

  10. Java文件输入输出

    public static void FileIO(String filename){ FileInputStream fis = null; try { fis = new FileInputStr ...