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,肯定会报数组下标越界异常啦~~