android-Ultra-Pull-To-Refresh上拉下拉结合通用适配器的使用

本篇结合了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();

   }

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


BEAN:
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值