ListView分页
和大多數初級玩家一樣,偶也終于玩到分頁了~ ~分頁有兩個方法:一個是handler,一個是AsyncTask.
我的listview里沒有包括圖像,所以就沒有用到AsyncTask.
準備工作:1.一個用來顯示正在加載的xml文件:
View Code <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/loading_layout"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:gravity="center_horizontal"><RelativeLayoutandroid:id="@+id/load_id"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:gravity="center_vertical"android:text="Loading..."android:textSize="12pt" /><ProgressBar android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:layout_alignParentRight="true"/></RelativeLayout> </LinearLayout>2.listview布局文件:
View Code <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/customer_list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffff"android:orientation="vertical" ><ListViewandroid:id="@+id/lv_newtask"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dip"android:layout_marginRight="5dip"android:cacheColorHint="#ffffff"android:divider="#ffffff"android:dividerHeight="5dip"android:listSelector="#00000000" ></ListView> </LinearLayout>3.listview_item
View Code <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/newtask_selector_bg"android:minHeight="?android:attr/listPreferredItemHeight" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toLeftOf="@+id/avatar_image"android:orientation="vertical" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="訂單號:"android:textColor="#2894ff"android:textSize="17sp" ></TextView><TextViewandroid:id="@+id/tv_newtask_item_cwb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="01056895426"android:textColor="#2894ff"android:textSize="17sp" ></TextView></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="客戶名:"android:textColor="#2894ff"android:textSize="17sp" ></TextView><TextViewandroid:id="@+id/tv_newtask_item_consigneeName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="大胡子李"android:textColor="#2894ff"android:textSize="17sp" ></TextView></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="地 址:"android:textColor="#2894ff"android:textSize="17sp" ></TextView><TextViewandroid:id="@+id/tv_newtask_item_consigneeAddress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="龍口西"android:textColor="#2894ff"android:textSize="17sp" ></TextView></LinearLayout><TextViewandroid:id="@+id/user_status"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone" /><TextViewandroid:id="@+id/user_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone" /></LinearLayout><ImageViewandroid:id="@+id/iv_newtask_detail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:background="@drawable/detail" /></RelativeLayout>下面就要開始寫我們的分頁類了。
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.newtask);context = this;findViews();initListView();} View Code TextView tv_newtask_num;ListView lv_newtask;Context context;View loadingView;protected void findViews(){tv_newtask_num = (TextView) findViewById(R.id.tv_newtask_num);lv_newtask = (ListView) findViewById(R.id.lv_newtask);tv_newtask_num.setText(Constant.loginInfo.newTasksCount);loadingView = LayoutInflater.from(this).inflate(R.layout.list_page_load, null);}?
初始化listView,第一頁
NewTaskAdapter adapter;protected void initListView(){lv_newtask.addFooterView(loadingView);Constant.currentData = getData(currentPage, pageSize);adapter = new NewTaskAdapter();lv_newtask.setAdapter(adapter);lv_newtask.setOnScrollListener(this);lv_newtask.setOnItemClickListener(this);}別急,NewTaskAdapter是它的內部類:
class NewTaskAdapter extends BaseAdapter {public NewTaskAdapter(){DebugLog.i("調用了adapter的構造函數");}LayoutInflater inflater = LayoutInflater.from(context);int count=Constant.currentData.size();@Overridepublic int getCount() {return count;}@Overridepublic TaskInfo getItem(int position) {return Constant.currentData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder mHolder = null;if (convertView == null) {mHolder = new ViewHolder();convertView = inflater.inflate(R.layout.item_newtask, null);mHolder.tv_cwb = (TextView) convertView.findViewById(R.id.tv_newtask_item_cwb);mHolder.tv_consigneeName = (TextView) convertView.findViewById(R.id.tv_newtask_item_consigneeName);mHolder.tv_consigneeAddress = (TextView) convertView.findViewById(R.id.tv_newtask_item_consigneeAddress);mHolder.iv_newtask_detail = (ImageView)convertView.findViewById(R.id.iv_newtask_detail);convertView.setTag(mHolder);}else{mHolder = (ViewHolder) convertView.getTag();}mHolder.tv_cwb.setText(Constant.currentData.get(position).cwb);mHolder.tv_consigneeName.setText(Constant.currentData.get(position).consigneeName);mHolder.tv_consigneeAddress.setText(Constant.currentData.get(position).consigneeAddress);mHolder.iv_newtask_detail.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Bundle bundle = new Bundle();bundle.putSerializable("taskDetail", Constant.currentData.get(position));Intent intent = new Intent(context,NewTaskDetailActivity.class);intent.putExtras(bundle);context.startActivity(intent);}});return convertView;}public class ViewHolder{public TextView tv_cwb;public TextView tv_consigneeName;public TextView tv_consigneeAddress;public ImageView iv_newtask_detail; }}?
?
?Constant.currentData是什么呢?是我的全局類變量匯總:?public? static ArrayList<TaskInfo> currentData = new ArrayList<TaskInfo>();
獲取網絡數據:
View Code private ProgressDialog progressDialog;//private ArrayList<TaskInfo> tempList = null;private String fail_reason;protected ArrayList<TaskInfo> getData(int currentPage, int pageSize){ArrayList<TaskInfo> tempList = null;final String url = String.format(Constant.URL_NEWTASKLIST, Constant.loginInfo.mSessionId,0,pageSize,(currentPage-1)*pageSize);DebugLog.i("url: **"+url);String result = HttpClient.INSTANCE.get(url);if(result!=null){TaskInfoListParser parser = new TaskInfoListParser();tempList = parser.parse(result);fail_reason = parser.reason;}return tempList;}HttpClient.INSTANCE.get(url);這個方法:
View Code public enum HttpClient {INSTANCE; final int Timeouts = 30 * 1000; // millisecondsDefaultHttpClient httpClient = null;HttpContext localContext = null;HttpResponse response = null;HttpPost httpPost = null;HttpGet httpGet = null;public void initHttpClient() {HttpParams myParams = new BasicHttpParams();HttpConnectionParams.setConnectionTimeout(myParams, Timeouts);HttpConnectionParams.setSoTimeout(myParams, Timeouts);httpClient = new DefaultHttpClient(myParams);localContext = new BasicHttpContext();}public String get(String url) {if (httpClient == null) {initHttpClient();}httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.RFC_2109);httpGet = new HttpGet(url);response = null;httpGet.setHeader("Accept","application/soap+xml,application/dime,multipart/related,text/*");httpGet.setHeader("Content-Type", "text/xml;charset=utf-8");try {response = httpClient.execute(httpGet, localContext);if (response != null) {HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, "utf-8");}} } catch (Exception ex) {ex.printStackTrace();}return "";} }接下來是重點:監聽事件里面實現了分頁;
View Code private int last_item_position;boolean isLoading = false;//是否加載過,控制加載次數 @Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {last_item_position = firstVisibleItem + visibleItemCount - 1;if (last_item_position == totalItemCount - 2){//表示在第九個位置加載if(!isLoading){new Thread(){public void run() {isLoading = true;updateCurrendData();};}.start();}}} View Code private int addnum = 0;//新增加的項目條數protected void updateCurrendData(){currentPage++;ArrayList<TaskInfo> list = getData(currentPage, pageSize);Message msg = new Message();if(list==null){msg.what = Constant.NODATA;}else{addnum = list.size();for(TaskInfo ti:list){Constant.currentData.add(ti);}msg.what = Constant.FINISH;}handler.sendMessage(msg);}我的handler:
private int currentPage = 1;private int pageSize = 10;protected Handler handler = new Handler(){String tips = null;public void handleMessage(Message msg) {switch(msg.what){case Constant.FINISH:adapter.count = (currentPage-1)*pageSize+addnum; adapter.notifyDataSetChanged();handler.removeMessages(0);isLoading = false;break;case Constant.NODATA:Toast.makeText(context, "沒有了", Toast.LENGTH_LONG).show();lv_newtask.removeFooterView(loadingView);break;}if(tips!=null){Toast.makeText(context, tips, Toast.LENGTH_LONG).show();}}; };這樣就實現了分頁。一定要注意的是,?
private? int currentPage = 1;
?private? int pageSize = 10;
這兩個變量,一定不能設置成static 。這和activity的生命周期有關系。如果設置成了static ,那么onRestart以后,再請求的數據是空的,就會報出所謂的空指針異常了!
轉載于:https://www.cnblogs.com/miya2012/archive/2012/08/28/2660685.html
總結
以上是生活随笔為你收集整理的ListView分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL循环执行while控制
- 下一篇: java.security.Invali