安卓Listview 不规则项即不同item的运行_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 安卓Listview 不规则项即不同item的运行

安卓Listview 不规则项即不同item的运行

 2014/7/17 23:34:19  Top@Gragon  程序员俱乐部  我要评论(0)
  • 摘要:在安卓中,listview的item是一个不断被轮询调换位置的过程,这样即图片参考地址http://www.cnblogs.com/mybkn/archive/2012/05/23/2514681.html谢谢。开发中,我们经藏会遇到listview的每一项都不同的需求。这个时候如果使用以前自定义的BaseAdapter的方法的话。在滚动的时候就会出现item布局错乱的情况,也就是说第一项在最初的背景是红色的xml布局,当滚动到第二项置顶,在回到顶部的时候,顶部的项布局可能就不是最初的样子了
  • 标签:view list 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="code_img_closed" src="/Upload/Images/2014071723/0015B68B3C38AA5B.gif" alt="" />
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;
        }
    }
适配器
发表评论
用户名: 匿名