本篇结合了android-Ultra-Pull-To-Refresh上拉加载下拉刷新和万能适配器,自己使用了,总结一下,顺便能帮助到需要的人更好。
listView 的xml布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <in.srain.cube.views.ptr.PtrClassicFrameLayout android:id="@+id/load_more_list_view_ptr_frame" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- LoadMoreListViewContainer加载更多--> <in.srain.cube.views.loadmore.LoadMoreListViewContainer android:id="@+id/load_more_list_view_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/cube_mints_white"> <ListView android:id="@+id/homeworklist" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="5dip" android:cacheColorHint="#00000000" android:divider="@color/divider_color" android:dividerHeight="0.5dip" android:paddingLeft="@dimen/padding_left" android:paddingRight="@dimen/padding_left" /> </in.srain.cube.views.loadmore.LoadMoreListViewContainer> </in.srain.cube.views.ptr.PtrClassicFrameLayout> </RelativeLayout>
本文是在fragment写的,Fragment的代码:
public class NotStartHomeWorkFragment extends BaseFragment implements AdapterView.OnItemClickListener { private PtrFrameLayout mPtrFrameLayout;//下拉刷新 private LoadMoreListViewContainer mLoadMoreListViewContainer;//加载更多 private ListView mListView;//listview private List<NotStartHomeWork> mDatas;//填充的数据 NotStartHomeWorkAdapter mAdapter;//适配器 private int start = 0;//开始位置 private int count = 15;//每次加载15项 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_finished_home_work, container, false); initWidgets(view); return view; } private void initWidgets(View view) { mListView = (ListView) view.findViewById(R.id.homeworklist); // 为listview的创建一个headerview,注意,如果不加会影响到加载的footview的显示! View headerMarginView = new View(getContext()); headerMarginView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LocalDisplay.dp2px(20))); mListView.addHeaderView(headerMarginView); //设置适配器mAdapter mAdapter = new MyAdapter(getActivity(),getDate());//设置布局xml文件和填充数据 mListView.setAdapter(mAdapter);//绑定模拟的数据 //3.设置下拉刷新组件和事件监听 mPtrFrameLayout = (PtrFrameLayout) view.findViewById(R.id.load_more_list_view_ptr_frame); mPtrFrameLayout.setLoadingMinTime(1000); mPtrFrameLayout.setPtrHandler(new PtrHandler() { @Override public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) { // here check list view, not content. return PtrDefaultHandler.checkContentCanBePulledDown(frame, mListView, header);//mListView:listview } //实现下拉刷新的功能 @Override public void onRefreshBegin(PtrFrameLayout frame) { //实现下拉刷新的功能 Log.i("test", "-----onRefreshBegin-----"); mPtrFrameLayout.postDelayed(new Runnable() { @Override public void run() { mDatas.clear(); start = 0; //从0开始,加载15个项 mDatas.addAll(getMockData(start,count));//数据改变 mPtrFrameLayout.refreshComplete(); //第一个参数是:数据是否为空;第二个参数是:是否还有更多数据 mLoadMoreListViewContainer.loadMoreFinish(false, true); mAdapter.notifyDataSetChanged();//mAdapter通知 mDatas数据改变,让listview重新加载数据;listView 数据改变时自动更新listview列表: } }, 500); } }); //设置延时自动刷新数据 mPtrFrameLayout.postDelayed(new Runnable() { @Override public void run() { mPtrFrameLayout.autoRefresh(false); } }, 200); //4.加载更多的组件 mLoadMoreListViewContainer = (LoadMoreListViewContainer) view.findViewById(R.id.load_more_list_view_container); mLoadMoreListViewContainer.setAutoLoadMore(true);//设置是否自动加载更多 mLoadMoreListViewContainer.useDefaultHeader(); //5.添加加载更多的事件监听 mLoadMoreListViewContainer.setLoadMoreHandler(new LoadMoreHandler() { @Override public void onLoadMore(LoadMoreContainer loadMoreContainer) { //模拟加载更多的业务处理 mLoadMoreListViewContainer.postDelayed(new Runnable() { @Override public void run() { start++; mDatas.addAll(getMockData(start*10,count)); if (start * 10 > 30) { mLoadMoreListViewContainer.loadMoreFinish(true, false); //以下是加载失败的情节 int errorCode = 0; String errorMessage = "加载失败,点击加载更多"; // mLoadMoreListViewContainer.loadMoreError(errorCode, errorMessage); } else { mLoadMoreListViewContainer.loadMoreFinish(false, true); } mAdapter.notifyDataSetChanged(); } }, 1000); } }); initListener(); } private void initListener() { mListView.setOnItemClickListener(this);//listView OnItemClick事件 } //listview点击事件 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.v("Tag", "你点击了" + position); } private List<NotStartHomeWork> getMockData(int start, int count) { for(int i = start;i< start + count;i++){ NotStartHomeWork bean = new NotStartHomeWork("李四 ","你好","Hello","2016-6-6","暂停"); mDatas.add(bean); } return mDatas; } /*添加一个得到数据的方法,方便使用*/ private List<NotStartHomeWork> getDate(){ mDatas = new ArrayList<NotStartHomeWork>(); for(int i = 0;i<10;i++){ NotStartHomeWork bean = new NotStartHomeWork("张三 ","Hi","How are you","2016-7-15","暂停"); mDatas.add(bean); } return mDatas; } }上拉刷新,下拉加载结束;通用适配器的使用:public class MyAdapter extends CommAdapter<NotStartHomeWork>{ public MyAdapter (Context context, List<Bean> datas) { super(context, datas); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get(mContext,convertView,parent, R.layout.item,position);//item布局 Bean bean = mDatas.get(position);//mDatas在NotStartHomeWorkFragment从NotStartHomeWorkAdapter构造方法传过来, ((TextView)holder.getView(R.id.student)).setText(bean.getName()); ((TextView)holder.getView(R.id.title)).setText(bean.getTitle()); ((TextView)holder.getView(R.id.describe)).setText(bean.getDescribe()); ((TextView)holder.getView(R.id.time)).setText(bean.getTime()); ((TextView)holder.getView(R.id.state)).setText(bean.getState()); return holder.getConvertView(); }}BEAN:item:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.7" android:id="@+id/student" android:layout_marginTop="@dimen/margin_top" android:text="小刚" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/title" android:text="Hello" android:layout_marginTop="@dimen/margin_top" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2.1" android:id="@+id/describe" android:text="在干嘛" android:layout_marginTop="@dimen/margin_top" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.1" android:id="@+id/time" android:text="2016/5/10" android:layout_marginTop="@dimen/margin_top" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.1" android:id="@+id/state" android:text="暂停" android:layout_marginTop="@dimen/margin_top" /> </LinearLayout>public class Bean { private String name; private String title; private String describe; private String time; private String state; public Bean() { super(); } public Bean(String name, String title, String describe, String time, String state) { this.name = name; this.title = title; this.describe = describe; this.time = time; this.state = state; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getState() { return state; } public void setState(String state) { this.state = state; } }CommAdapter,与ViewHolder复制过去
public abstract class CommAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T>mDatas; protected LayoutInflater mInflater; public CommAdapter(Context context, List<T> datas) { this.mContext = context; mInflater= LayoutInflater.from(context); this.mDatas = datas; } @Override public int getCount() { // TODO Auto-generated method stub return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public abstract View getView(int position, View convertView, ViewGroup parent) ;}
ViewHolder:
public class ViewHolder { private SparseArray<View> mViews;//用来存储item中的控件 private int mPosition; private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId,int position){ this.mPosition= position; this.mViews= new SparseArray<View>(); mConvertView =LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public View getConvertView() { return mConvertView; } public static ViewHolder get(Context context, View convertView,ViewGroup parent, int layoutId,int position){ if(convertView==null){//当convertView布局为空时,new一个ViewHolder return new ViewHolder(context, parent, layoutId, position); }else{ ViewHolder holder = (ViewHolder) convertView.getTag();//当convertView布局不为空时,获取convertView中的控件复用 holder.mPosition = position; return holder; } } //通过viewId获取控件 public <T extends View> T getView(int viewId) { View view = mViews.get(viewId);//根据id获取item中的控件 if(view==null){//当没有此id控件的时候 view = mConvertView.findViewById(viewId);//从mConvertView中获取id的控件 mViews.put(viewId, view); } return (T)view; } //辅助方法,可写可不写 public ViewHolder setText(int viewId,String text) { TextView tv = getView(viewId); tv.setText(text); return this; } public ViewHolder setImageResource(int viewId, int resId) { ImageView view = getView(viewId); view.setImageResource(resId); return this; } public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) { ImageView view = getView(viewId); view.setImageBitmap(bitmap); return this; } }
OK。参考:http://www.07net01.com/program/2016/02/1309061.html