在使用listview时,滑动加载可以提高效率,增加用户体验。
主要用到一个OnScrollListener
/** * The view is not scrolling. Note navigating the list using the trackball counts as * being in the idle state since these transitions are not animated. */ public static int SCROLL_STATE_IDLE = 0; /** * The user is scrolling using touch, and their finger is still on the screen */ public static int SCROLL_STATE_TOUCH_SCROLL = 1; /** * The user had previously been scrolling using touch and had performed a fling. The * animation is now coasting to a stop */ public static int SCROLL_STATE_FLING = 2; /** * Callback method to be invoked while the list view or grid view is being scrolled. If the * view is being scrolled, this method will be called before the next frame of the scroll is * rendered. In particular, it will be called before any calls to * {@link Adapter#getView(int, View, ViewGroup)}. * * @param view The view whose scroll state is being reported * * @param scrollState The current scroll state. One of {@link #SCROLL_STATE_IDLE}, * {@link #SCROLL_STATE_TOUCH_SCROLL} or {@link #SCROLL_STATE_IDLE}. */ public void onScrollStateChanged(AbsListView view, int scrollState); /** * Callback method to be invoked when the list or grid has been scrolled. This will be * called after the scroll has completed * @param view The view whose scroll state is being reported * @param firstVisibleItem the index of the first visible cell (ignore if * visibleItemCount == 0) * @param visibleItemCount the number of visible cells * @param totalItemCount the number of items in the list adaptor */ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount);
package com.nico.listviewload; import java.util.ArrayList; import java.util.List; import com.nico.bean.MsgInfo; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.AbsListView.OnScrollListener; public class MainActivity extends Activity { List<MsgInfo> infoList = null; private LayoutInflater inflater = null; private ListView listview = null; private myAdapter adapter = null; private LinearLayout ftview = null; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 1: adapter.notifyDataSetChanged(); try { Thread.sleep(2000l); } catch (InterruptedException e) { e.printStackTrace(); } setAdapter(); break; } } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); inflater = this.getLayoutInflater(); listview = (ListView) findViewById(R.id.listview); ftview = (LinearLayout) inflater.inflate(R.layout.ftview, null); listview.addFooterView(ftview, null, false); listview.setAdapter(new myAdapter()); adapter = new myAdapter(); ftview.setVisibility(View.VISIBLE); listview.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE && view.getLastVisiblePosition() == view.getCount() - 1) { handler.sendEmptyMessage(1); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } public List<MsgInfo> getList() { List<MsgInfo> infoList = new ArrayList<MsgInfo>(); for (int i = 0; i < 7; i++) { MsgInfo info = new MsgInfo(); info.id = i; info.detailinfo = "这是第" + i + "条信息"; info.name = "第" + i + "项"; info.size = 1024 * i; infoList.add(info); } return infoList; } public void setData() { infoList = getList(); } public void setAdapter() { for (int i = 0; i < 7; i++) { MsgInfo info = new MsgInfo(); info.id = i; info.detailinfo = "这是第" + i + "条信息"; info.name = "第" + i + "项"; info.size = 1024 * i; infoList.add(info); } adapter.notifyDataSetChanged(); } public class myAdapter extends BaseAdapter { @Override public void notifyDataSetChanged() { if(ftview.getVisibility()==View.VISIBLE) { ftview.setVisibility(View.GONE); } else if(ftview.getVisibility()==View.GONE) { ftview.setVisibility(View.VISIBLE); } super.notifyDataSetChanged(); } TextView name, detail, size; public myAdapter() { setData(); } @Override public int getCount() { return infoList.size(); } @Override public Object getItem(int position) { return infoList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.item, null, false); } name = (TextView) convertView.findViewById(R.id.name); detail = (TextView) convertView.findViewById(R.id.detail); size = (TextView) convertView.findViewById(R.id.size); name.setText(infoList.get(position).name); detail.setText(infoList.get(position).detailinfo); size.setText(infoList.get(position).size + ""); return convertView; } } public class LoadAsyTask extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { for (int i = 0; i < 7; i++) { MsgInfo info = new MsgInfo(); info.id = i; info.detailinfo = "这是第" + i + "条信息"; info.name = "第" + i + "项"; info.size = 1024 * i; infoList.add(info); } return null; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); ftview.setVisibility(View.GONE); adapter.notifyDataSetChanged(); } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="fill_parent" android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"> <ImageView android:layout_width="50dip" android:layout_height="50dip" android:src="@drawable/progressbar" android:id="@+id/pbdrawable" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请稍后..." android:id="@+id/pbtxt" /> </LinearLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="360"> <shape android:shape="ring" android:innerRadiusRatio="3" android:thicknessRatio="8" android:useLevel="false"> <gradient android:type="sweep" android:useLevel="false" android:startColor="#000000" android:centerColor="#FFFFFF" android:centerY="0.50" android:endColor="#000000" /> </shape> </rotate>