Android開原始碼解讀のOnScrollListener實現ListView滾屏時不載入資料

來源:互聯網
上載者:User

使用ListView過程中,如果滾動式載入資料的操作比較費時,很容易在滾屏時出現螢幕卡住的現象,一個解決的辦法就是不要在滾動時載入資料,而是等到滾動停止後再進行資料的載入。這同樣要實現OnScrollListener介面,關於該介面的簡要描述見上一篇文章,這裡直接進行代碼的分析:

package hust.iprai.asce1885;</p><p>import android.app.ListActivity;<br />import android.content.Context;<br />import android.os.Bundle;<br />import android.view.LayoutInflater;<br />import android.view.View;<br />import android.view.ViewGroup;<br />import android.widget.AbsListView;<br />import android.widget.AbsListView.OnScrollListener;<br />import android.widget.BaseAdapter;<br />import android.widget.TextView;</p><p>public class MainActivity extends ListActivity implements OnScrollListener {</p><p>private TextView mStatus; //顯示滾屏狀態<br />private boolean mBusy = false; //標識是否存在滾屏操作</p><p>/**<br /> * 自訂Adapter,實現ListView中view的顯示<br /> *<br /> */<br />private class SlowAdapter extends BaseAdapter {<br />private LayoutInflater mInflater;</p><p>public SlowAdapter(Context context) {<br />mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<br />}</p><p>/**<br /> * 列表中元素個數取決於資料的個數<br /> */<br />public int getCount() {<br />return mStrings.length;<br />}</p><p>/**<br /> * 我們的類比資料是從數組中擷取的,因此這裡直接返回索引值就可以擷取相應的資料了<br /> */<br />public Object getItem(int position) {<br />return position;<br />}</p><p>/**<br /> * 使用數組的索引作為唯一的id<br /> */<br />public long getItemId(int position) {<br />return position;<br />}</p><p>/**<br /> * 擷取List中每一行的view<br /> */<br />public View getView(int position, View convertView, ViewGroup parent) {<br />TextView text;</p><p>//給text賦值<br />if (null == convertView) {<br />text = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);<br />} else {<br />text = (TextView) convertView;<br />}</p><p>if (!mBusy) {<br />//當前不處於載入資料的忙碌時期(沒有滾屏),則顯示資料<br />text.setText(mStrings[position]);<br />//這裡約定將tag設定為null說明這個view已經有了正確的資料<br />text.setTag(null);<br />} else {<br />//當前處於滾屏階段,不載入資料,直接顯示資料載入中提示<br />text.setText("Loading...");<br />//tag非空說明這個view仍然需要進行資料載入並顯示<br />text.setTag(this);<br />}</p><p>return text;<br />}</p><p>}</p><p> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);</p><p> mStatus = (TextView) findViewById(R.id.status);<br /> mStatus.setText("Idle");</p><p> //使用自訂的ListAdapter將資料對應到TextView中<br /> setListAdapter(new SlowAdapter(this));</p><p> //設定滾動監聽器<br /> getListView().setOnScrollListener(this);<br /> }</p><p>public void onScroll(AbsListView view, int firstVisibleItem,<br />int visibleItemCount, int totalItemCount) {</p><p>}</p><p>public void onScrollStateChanged(AbsListView view, int scrollState) {<br />switch (scrollState) {<br />case OnScrollListener.SCROLL_STATE_IDLE: //Idle態,進行實際資料的載入顯示<br />mBusy = false;</p><p>int first = view.getFirstVisiblePosition();<br />int count = view.getChildCount();<br />for (int i = 0; i < count; i++) {<br />TextView tv = (TextView) view.getChildAt(i);<br />if (tv.getTag() != null) { //非null說明需要載入資料<br />tv.setText(mStrings[first + i]);<br />tv.setTag(null);<br />}<br />}</p><p>mStatus.setText("Idle");<br />break;<br />case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:<br />mBusy = true;<br />mStatus.setText("Touch Scroll");<br />break;<br />case OnScrollListener.SCROLL_STATE_FLING:<br />mBusy = true;<br />mStatus.setText("Fling");<br />break;<br />default:<br />mStatus.setText("Are you kidding me!");<br />break;<br />}<br />}</p><p> private String[] mStrings = {<br /> "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam",<br /> "Abondance", "Ackawi", "Acorn", "Adelost", "Affidelice au Chablis",<br /> "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",<br /> "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",<br /> "Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh",<br /> "Anthoriro", "Appenzell", "Aragon", "Ardi Gasna", "Ardrahan",<br /> "Armenian String", "Aromes au Gene de Marc", "Asadero", "Asiago",<br /> "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss", "Babybel",<br /> "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal",<br /> "Banon", "Barry's Bay Cheddar", "Basing", "Basket Cheese",<br /> "Bath Cheese", "Bavarian Bergkase", "Baylough", "Beaufort",<br /> "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",<br /> "Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir",<br /> "Bierkase", "Bishop Kennedy", "Blarney", "Bleu d'Auvergne",<br /> "Bleu de Gex", "Bleu de Laqueuille", "Bleu de Septmoncel",<br /> "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",<br /> "Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini",<br /> "Bocconcini (Australian)", "Boeren Leidenkaas", "Bonchester",<br /> "Bosworth"};</p><p>}下面是布局檔案main.xml:

<?xml version="1.0" encoding="utf-8"?></p><p><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="match_parent"<br /> android:layout_height="match_parent"></p><p> <ListView android:id="@android:id/list"<br /> android:layout_width="match_parent"<br /> android:layout_height="0dip"<br /> android:layout_weight="1"<br /> android:drawSelectorOnTop="false"/></p><p> <TextView android:id="@+id/status"<br /> android:layout_width="match_parent"<br /> android:layout_height="wrap_content"<br /> android:paddingLeft="8dip"<br /> android:paddingRight="8dip"/></p><p></LinearLayout>程式運行結果如所示:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.