关于实现ListView原生上拉加载的一些细节问题分析

本文详细介绍了自定义Android ListView的Adapter实现方法,特别是如何正确处理不同类型视图的展示及避免数组越界异常。通过实例展示了如何区分不同的item类型,并正确设置footer视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    
package com.example.wbu.rxjava;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by wbu on 2016/8/7.
 */
public class MyAdapter extends BaseAdapter{
    private Context mContext;
    private ArrayList mArrayListl;

    private int count;
    private final static int TYPE1=0;
    private final static int TYPE2=1;
    private View mFootView;
    private ListView mLv;

    private boolean mFlag;
    private OnScrollListener mScollListener;
    private final ScrollState scrollState;

    public  MyAdapter(Context context,ArrayList arrayListl){
        mContext = context;
        mArrayListl = arrayListl;
        scrollState = new ScrollState();
    }

    @Override
    public int getCount() {
        return mArrayListl.size()+1;/*mFlag?mArrayListl.size()+1:mArrayListl.size();*/
    }

    @Override
    public int getItemViewType(int position) {
        if(position==getCount()-1) {
            return TYPE1;
        }else{
            return TYPE2;
        }
    }

    @Override
    public int getViewTypeCount() {
        return 2;/*mFlag?2:1;*/
    }



    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Log.w("========position",position+": ViewType :"+getItemViewType(position)+": ViewTypeCount :"+getViewTypeCount() + ": count :"+getCount());
        if(getItemViewType(position)==TYPE1) {
             scrollState.curr_state=ScrollState.STATE_LOAD;
           //  mScollListener.OnScroll(scrollState);
             return mFootView;
        }else {
            String str = (String) mArrayListl.get(position);
//            mScollListener.OnScroll(scrollState);
            if(convertView==null){
                convertView=View.inflate(mContext,R.layout.item_layout,null);
            }
            View iv = convertView.findViewById(R.id.item_iv);
            TextView tv = (TextView) convertView.findViewById(R.id.item_tv);
            Log.e("========",str);
            tv.setText(str);
            return convertView;
        }

    }

    public void addFootView(View footView, ListView lv){

        mFootView = footView;
        mLv = lv;
        mFlag=true;
    }

    public void setOnScollListener(OnScrollListener scollListener){

        mScollListener = scollListener;
    }

}




第一个需要注意的细节是

    private final static int TYPE1=0;
    private final static int TYPE2=1;


这个不同item的类型必须从0开始 ,如果写成这样就会报错

    private final static int TYPE1=1;
    private final static int TYPE2=2;


   @Override
    public int getItemViewType(int position) {
        if(position==getCount()-1) {
            return TYPE1;
        }else{
            return TYPE2;
        }
    }

第二个问题就在type判断里,这里我一开始没有-1,那么后果是什么呢?就是ArrayList集合报出数组越界异常,

我们分析一下为什么会这样,

在getCount()方法里返回的是传入的集合长度+1(需要加上footer布局,如果不加1列表会少显示一个)假设传入的一个集合长度是5如果你不去-1,滑动到最后一个条目的时候当我们if判断里面 position==getCount就永远不成立,因为getCount() 等于6(集合长度为5 + 一个footer) 而position此时为5,那么滑动到position =5 的时候就会返回Type2,在getView里就会走下面else里面的逻辑

  if(position==getCount()-1) {
      .....
   }
  else {
            String str = (String) mArrayListl.get(position);
            mScollListener.OnScroll(scrollState);
            if(convertView==null){
                convertView=View.inflate(mContext,R.layout.item_layout,null);
            }
            View iv = convertView.findViewById(R.id.item_iv);
            TextView tv = (TextView) convertView.findViewById(R.id.item_tv);
            Log.e("========",str);
            tv.setText(str);
            return convertView;
         }


这段判断,此时position为5,又从集合里面去取角标为5的元素但是这个集合总长度为5,角标只有0-4,肯定会报数组下标越界异常啦~~


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值