android中listview分頁載入資料

來源:互聯網
上載者:User

標籤:

               前段時間做的新浪微博項目一直想實現listview分頁載入資料,今天最終實現了,哈哈!感覺挺好的,今天又寫了個demo給大家分享下。

              首先說下listview的最佳化方案,這也是面試中常考的題目。最佳化方案有三種:1,假設自己定義適配器,那麼在getView方法中推斷contentView是否為空白,假設為空白建立contentView並返回,假設不為空白直接返回contentView。這樣能儘可能少建立view。2.給contentView設定tag,傳入一個viewHoder對象,用於緩衝要實現的資料。3,假設listview中顯示的item太多,就要考慮分頁載入了。

               以下就注意介紹一下分頁載入資料。首先在layout下建立listview.xml:

           

<?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"    android:orientation="vertical" >    <ListView        android:id="@+id/listView1"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </ListView></LinearLayout>
          然後建立listview_item.xml:

          

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:orientation="vertical"      android:layout_width="fill_parent"      android:layout_height="fill_parent">      <TextView          android:id="@+id/list_item_text"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:gravity="center"          android:textSize="20sp"          android:paddingTop="10dp"          android:paddingBottom="10dp"/>  </LinearLayout>  

           再為跟多button加入一個xml:

      

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:gravity="center"    android:orientation="vertical" >    <Button        android:id="@+id/loadMoreButton"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="loadMore"        android:text="載入很多其它" /></LinearLayout>
     

           代碼部分:

       

public class ListViewAdapter extends BaseAdapter {private static Map<Integer,View> m=new HashMap<Integer,View>();private List<String> items;private LayoutInflater inflater;public ListViewAdapter(List<String> items, Context context) {super();this.items = items;this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn items.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn items.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View contentView, ViewGroup arg2) {// TODO Auto-generated method stubcontentView=m.get(position);if(contentView==null){contentView=inflater.inflate(R.layout.listview_item, null);TextView text=(TextView) contentView.findViewById(R.id.list_item_text);text.setText(items.get(position));}m.put(position, contentView);return contentView;}public void addItem(String item) {          items.add(item);      }  }

         
public class ListViewActivity extends Activity implements OnScrollListener  {  List<String> items = new ArrayList<String>();   private ListView listView;      private int visibleLastIndex = 0;   //最後的可視項索引      private int visibleItemCount;       // 當前表單可見項總數      private ListViewAdapter adapter;      private View loadMoreView;      private Button loadMoreButton;      private Handler handler = new Handler();        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.listview);                    loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);          loadMoreButton = (Button) loadMoreView.findViewById(R.id.loadMoreButton);          loadMoreButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubloadMoreButton.setText("正在載入...");   //設定button文字loading          handler.postDelayed(new Runnable() {              @Override              public void run() {                                    loadData();                                    adapter.notifyDataSetChanged(); //資料集變化後,通知adapter                  listView.setSelection(visibleLastIndex - visibleItemCount + 1); //設定選中項                                    loadMoreButton.setText("載入很多其它");    //恢複button文字              }          }, 1000);  }});        listView = (ListView) this.findViewById(R.id.listView1);                  listView.addFooterView(loadMoreView);   //設定列表底部視圖         // listView.addHeaderView(v)    //設定列表頂部視圖          initAdapter();                    listView.setAdapter(adapter);                //自己主動為id是list的ListView設定適配器                    listView.setOnScrollListener(this);     //加入滑動監聽          listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View view,int position, long arg3) {// TODO Auto-generated method stubToast.makeText(getApplicationContext(), items.get(position),Toast.LENGTH_SHORT).show();}});    }            /**      * 初始化適配器      */      private void initAdapter() {               for (int i = 0; i < 20; i++) {              items.add(String.valueOf(i + 1));          }          adapter = new ListViewAdapter(items,this);      }        /**      * 滑動時被調用      */      @Override      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {          this.visibleItemCount = visibleItemCount;          visibleLastIndex = firstVisibleItem + visibleItemCount - 1;      }        /**      * 滑動狀態改變時被調用      */      @Override      public void onScrollStateChanged(AbsListView view, int scrollState) {          int itemsLastIndex = adapter.getCount() - 1;    //資料集最後一項的索引          int lastIndex = itemsLastIndex + 1;             //加上底部的loadMoreView項          if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) {              //假設是自己主動載入,能夠在這裡放置非同步載入資料的代碼              Log.i("LOADMORE", "loading...");          }      }            /**      * 類比載入資料      */      private void loadData() {          int count = adapter.getCount();          for (int i = count; i < count + 20; i++) {              adapter.addItem(String.valueOf(i + 1));          }      }}

           最後看看效果:

        

      

       

       

       


android中listview分頁載入資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.