安卓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 =0;i<500;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 = 3;
        final int TYPE_1 = 0;
        final int TYPE_2 = 1;
        final int TYPE_3 = 2;

        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 0;
        }

        // 每个convert view都会调用此方法,获得当前所需要的view样式
        @Override
        public int getItemViewType(int position) {
            int p = position;
            if (p == 0)
                return TYPE_1;
            else if (p == 1)
                return TYPE_2;
            else
                return TYPE_3;
        }

        @Override
        public int getViewTypeCount() {
            return 3;
        }

        @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的运行

时间: 2024-10-10 11:06:18

安卓Listview 不规则项即不同item的运行的相关文章

安卓ListView 如何设置item的高度

安卓中的listview,设置其显示item布局的高度来设置item在listview中显示的高度是不可取的.如何设置item的高度? 分为两种情况: 1.有图片的情况: 有图片的情况比较简单,布局的大小将会由图片的大小来撑起,这是只需要调节图片的width和height即可. 2.无图片情况 无图片的情况我们可以用两种方式来确定大小 a.在布局中使用Android:minHeight="5dp",填上需要的最小高度,这个方便直接. b.如果是在自己写的Adapter中,那就可以在ge

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

ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能! 实际上Android为你缓存了视图. Android中有个叫做Recycler的构件,下图是他的工作原理: 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中. ListView先请求一个t

怎样对ListView的项进行排序

当您使用资源浏览器查看文件时,您能够随心所欲的按名称.大小.类型及改动日期不同的列对文件进行大小排序..Net提供的ListView组件没有直接提供这样的功能,但要实现并不难.   ListView.Sort()方法的功能是“对列表视图的项进行排序”,可当您调用它时却什么也没有发生,原因是您没有为listView1.ListViewItemSorter指定排序器.所以,首先必须写一个排序类.public class mySorter:IComparer{private Comparer comp

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

listview当选中某一个item时设置背景色其他的不变: 可以使用listview.setOnFoucsChangeListener(listener) ; /** * listview获得焦点和失去焦点时背景颜色的变化 * @author long * */ private class MyOnFocusChangeListener implements OnFocusChangeListener{ @Override public void onFocusChange(View v, b

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

time:2015/05/04 1. 描述 在cocostudio中有两个控件,一个listview,另外一个是隐藏的imageview,其中后者作为listview的元素.每次使用的时候把ImageView设置为默认的item(setItemModel),然后通过listview:pushBackDefaultItem进行插入指定个数的元素.但是在使用过程中会修改listview中的元素(通过getItem得到其中的元素),结果修改了listview的元素之后作为默认itemmodel的Ima

Android ListView 长按如何获取item的主键并操作对应数据库元组

============问题描述============ 我做的是一个租房管理系统,大概是现在在对房子操作这个界面,我现在是要长按listView中的某一个Item,要求实现修改和删除功能. This is my house_setting.xml document <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

Android开发:ListView控件:给Item绑定了点击事件,却点击无效

一.问题引入 ListView控件:给Item绑定了点击事件,却点击无效. 二.解决方案 ListView使用了自定义布局文件,在布局文件中有button等控件时,这些控件获取焦点的级别比listView的item高,所以当点击item时,button等控件会优先获得点击焦点. 解决方法就是在布局文件根元素中添加属性: android:descendantFocusability="blocksDescendants" android:descendantFocusability De

安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)

ListView 自身提供了 CheckBox 只需要添加一行代码 getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 但是这种实现想要自己控制操作起来局限很多.所以我选择了自己添加CheckBox的方式.可以支持列表项的全选,删除,并保持数据的对应关系不会乱. 列表中的CheckBox选中状态与一个Map进行绑定,利用 adapter.notifyDataSetChanged();来更新界面. 效果如下: 下面直接看代码把.

listView 解决焦点冲突问题 item项和子控件之间的冲突

listView 在item布局的顶级布局中设置 android:descendantFocusability="blocksDescendants"可以阻止子控件获取焦点 这样使item项可以点击 这时其中的图片控件还是可以点击的当不想让item能点击时 可以不加上边的设置 并且将焦点转移到子控件 focusable属性 <TextView android:id="@+id/recommend_album_more" android:layout_width