Android ListView滑動加載

項目結構如圖所示:

項目主要包括一個activity和三個xml頁面佈局,代碼如下:

MainActivity.java

import android.app.ListActivity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.AbsListView;  
import android.widget.BaseAdapter;  
import android.widget.Button;  
import android.widget.LinearLayout;  
import android.widget.ListView;  
import android.widget.TextView;  
import android.widget.AbsListView.OnScrollListener;  
 
public class MainActivity extends ListActivity implements OnScrollListener {  
      
    private ListView listView;  
    //全局變量,用來記錄ScrollView的滾動狀態,1表示開始滾動,2表示正在滾動,0表示停止滾動  
    private int scrollState;  
    //可加載記錄的條數  
    private int count = 100;  
    private int lastItem;  
    //當前可見頁面中的Item總數  
    private int visibleItemCount;  
      
    private Button footerButton;  
    private LinearLayout footerProgressBarLayout;  
    private View view;  
    private ListAdapter mAdapter = new ListAdapter();  
      
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        //加載主頁面佈局  
        setContentView(R.layout.main);  
          
        LayoutInflater inflater = LayoutInflater.from(this);  
        //加載底部佈局  
        view = inflater.inflate(R.layout.main_more, null);  
        footerButton = (Button) view.findViewById(R.id.button);  
        footerProgressBarLayout = (LinearLayout) view.findViewById(R.id.linearlayout);  
        footerProgressBarLayout.setVisibility(View.GONE);  
        //更多按鈕點擊事件  
        footerButton.setOnClickListener(new View.OnClickListener() {  
              
            public void onClick(View v) {  
                if(lastItem == mAdapter.count && scrollState == OnScrollListener.SCROLL_STATE_IDLE){  
                    //設置頁面底部佈局控件可見性  
                    footerButton.setVisibility(View.GONE);  
                    footerProgressBarLayout.setVisibility(View.VISIBLE);  
                    if(mAdapter.count <= count){  
                        //使用Handler動態加載數據  
                        new Handler().postDelayed(new Runnable() {  
                              
                            public void run() {  
                                mAdapter.count += 10;  
                                mAdapter.notifyDataSetChanged();  
                                listView.setSelection(lastItem - visibleItemCount + 1);  
                                //獲取數據成功設置Layout不可見,Button設爲可見  
                                footerButton.setVisibility(View.VISIBLE);  
                                footerProgressBarLayout.setVisibility(View.GONE);  
                            }  
                        } , 2000);  
                    }  
                }  
            }  
        });  
          
        listView = getListView();  
        //將佈局添加到ListView的Footer中  
        listView.addFooterView(view);  
        listView.setAdapter(mAdapter);  
          
        //設置滑動監聽  
        listView.setOnScrollListener(this);  
    }  
 
    public void onScroll(AbsListView view, int firstVisibleItem,  
            int visibleItemCount, int totalItemCount) {  
        this.visibleItemCount = visibleItemCount;  
        lastItem = firstVisibleItem + visibleItemCount - 1;  
        if(mAdapter.count >= count){  
            listView.removeFooterView(view);  
        }  
          
//        boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount;  
//        if(loadMore){  
//          mAdapter.count += visibleItemCount;  
//          mAdapter.notifyDataSetChanged();  
//        }  
    }  
 
    public void onScrollStateChanged(AbsListView view, int scrollState) {  
        this.scrollState = scrollState;  
    }  
      
    /**  
     * 數據匹配器  
     * @author qin_lei  
     *  
     */ 
    public class ListAdapter extends BaseAdapter{  
 
        int count = 10;  
          
        public int getCount() {  
            return count;  
        }  
 
        public Object getItem(int position) {  
            return position;  
        }  
 
        public long getItemId(int position) {  
            return position;  
        }  
 
        public View getView(int position, View convertView, ViewGroup parent) {  
            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);  
            View view = inflater.inflate(R.layout.main_item, null);  
            TextView tv = (TextView) view.findViewById(R.id.tv);  
            tv.setText("Hello " + position);  
            return view;  
        }  
    }  
} 

主要佈局文件代碼如下:

main.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">      
    <ListView            
        android:id="@android:id/list"          
        android:layout_width="fill_parent"           
        android:layout_height="wrap_content"/> 
</LinearLayout> 

main_more.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">      
    <Button          
        android:id="@+id/button"          
        android:layout_width="fill_parent"           
        android:layout_height="wrap_content"           
        android:text="更多"/>      
    <LinearLayout          
        android:orientation="horizontal"          
        android:layout_width="fill_parent"          
        android:layout_height="wrap_content"          
        android:gravity="center"          
        android:id="@+id/linearlayout">          
        <ProgressBar              
            android:layout_width="wrap_content"              
            android:layout_height="wrap_content"/>          
        <TextView              
            android:layout_width="wrap_content"              
            android:layout_height="wrap_content"              
            android:text="正在獲取..."/>          
    </LinearLayout> 
</LinearLayout>

ListView單個顯示item佈局main_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      
    android:orientation="horizontal"      
    android:layout_width="fill_parent"      
    android:layout_height="fill_parent">      
    <ImageView          
        android:layout_width="wrap_content"          
        android:layout_height="wrap_content"          
        android:scaleType="fitXY"          
        android:src="@drawable/icon_head"/>      
    <TextView          
        android:id="@+id/tv"          
        android:layout_width="fill_parent"           
        android:layout_height="20dp"           
        android:text="@string/hello"/> 
</LinearLayout>

項目運行結果如下圖:

點擊更多,十條,依次類推:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章