Android中下拉加载的实现
Android中下拉加载的实现
2013-08-04 16:12:21
最近在做项目的过程中,需要用到下拉加载的功能。总结了一下下拉加载实现的实现。
首先,我们在main.xml中加入一个listview
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent" 4 android:orientation="vertical"> 5 6 <ListView 7 android:layout_width="fill_parent" 8 android:layout_height="wrap_content" 9 android:id="@+id/lvNews"/> 10 11 </LinearLayout>
然后,设置listview中每一个item的布局item.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent" 4 android:orientation="vertical"> 5 6 <TextView 7 android:layout_width="fill_parent" 8 android:layout_height="wrap_content" 9 android:id="@+id/newstitle"/> 10 11 <TextView 12 android:layout_width="fill_parent" 13 android:layout_height="wrap_content" 14 android:id="@+id/newscontent"/> 15 </LinearLayout>
以上的对item的布局实现的是每一个item中放置了一上一下的两个Textview
最后我们设置一个Button,这个Button加在listview的下面,是用来实现点击加载的 loadmore.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent"> 4 5 <Button 6 android:layout_width="fill_parent" 7 android:layout_height="wrap_content" 8 android:id="@+id/loadMoreButton" 9 android:text="查看更多..."/> 10 11 </LinearLayout>
接下来是下拉加载的实现代码,首先,类要继承OnScrollListener,继承该接口需要实现两个重载方法:onScrollStateChanged()、onScroll()。下面直接上代码,代码中有详细的注解。
1 public class PaginationListViewActivity extends Activity implements OnScrollListener { 2 3 private ListView listView; 4 private int visibleLastIndex = 0; //最后的可视项索引 5 private int visibleItemCount; // 当前窗口可见项总数 6 private int datasize = 38; //模拟数据集的条数 7 private PaginationAdapter adapter; 8 private View loadMoreView; 9 private Button loadMoreButton; 10 private Handler handler = new Handler(); 11 12 /** Called when the activity is first created. */ 13 @Override 14 public void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_pagination_list_view); 17 18 loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null); 19 loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton); 20 loadMoreButton.setOnClickListener(new View.OnClickListener() { 21 22 @Override 23 public void onClick(View v) { 24 loadMoreButton.setText("正在加载中..."); //设置按钮文字 25 handler.postDelayed(new Runnable() { 26 27 @Override 28 public void run() { 29 loadMoreData(); 30 adapter.notifyDataSetChanged(); 31 loadMoreButton.setText("查看更多..."); //恢复按钮文字 32 } 33 },2000); 34 35 } 36 }); 37 38 listView = (ListView)findViewById(R.id.lvNews); 39 listView.addFooterView(loadMoreView); //设置列表底部视图 40 initializeAdapter(); 41 listView.setAdapter(adapter); 42 listView.setOnScrollListener(this); 43 } 44 45 @Override 46 public void onScrollStateChanged(AbsListView view, int scrollState) { 47 int itemsLastIndex = adapter.getCount()-1; //数据集最后一项的索引 48 int lastIndex = itemsLastIndex + 1; 49 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE 50 && visibleLastIndex == lastIndex) { 51 // 如果是自动加载,可以在这里放置异步加载数据的代码 52 } 53 } 54 55 56 @Override 57 public void onScroll(AbsListView view, int firstVisibleItem, 58 int visibleItemCount, int totalItemCount) { 59 this.visibleItemCount = visibleItemCount; 60 visibleLastIndex = firstVisibleItem + visibleItemCount - 1; 61 62 Log.e("========================= ","========================"); 63 Log.e("firstVisibleItem = ",firstVisibleItem+""); 64 Log.e("visibleItemCount = ",visibleItemCount+""); 65 Log.e("totalItemCount = ",totalItemCount+""); 66 Log.e("========================= ","========================"); 67 68 //如果所有的记录选项等于数据集的条数,则移除列表底部视图 69 if(totalItemCount == datasize+1){ 70 listView.removeFooterView(loadMoreView); 71 Toast.makeText(this, "数据全部加载完!", Toast.LENGTH_LONG).show(); 72 } 73 } 74 75 /** 76 * 初始化ListView的适配器 77 */ 78 private void initializeAdapter(){ 79 List<News> news = new ArrayList<News>(); 80 for(int i=1;i<=10;i++){ 81 News items = new News(); 82 items.setTitle("Title"+i); 83 items.setContent("This is News Content"+i); 84 news.add(items); 85 } 86 adapter = new PaginationAdapter(news); 87 } 88 89 /** 90 * 加载更多数据 91 */ 92 private void loadMoreData(){ 93 int count = adapter.getCount(); 94 95 if(count+10 <= datasize){ 96 for(int i=count+1; i<=count+10; i++){ 97 News item = new News(); 98 item.setTitle("Title"+i); 99 item.setContent("This is News Content"+i); 100 adapter.addNewsItem(item); 101 } 102 }else{ 103 for(int i=count+1; i<=datasize; i++){ 104 News item = new News(); 105 item.setTitle("Title"+i); 106 item.setContent("This is News Content"+i); 107 adapter.addNewsItem(item); 108 } 109 } 110 111 } 112 113 114 class PaginationAdapter extends BaseAdapter{ 115 116 List<News> newsItems; 117 118 public PaginationAdapter(List<News> newsitems){ 119 this.newsItems = newsitems; 120 } 121 122 @Override 123 public int getCount() { 124 return newsItems.size(); 125 } 126 127 @Override 128 public Object getItem(int position) { 129 return newsItems.get(position); 130 } 131 132 @Override 133 public long getItemId(int position) { 134 return position; 135 } 136 137 @Override 138 public View getView(int position, View view, ViewGroup parent) { 139 if(view == null){ 140 view = getLayoutInflater().inflate(R.layout.list_item, null); 141 } 142 143 //新闻标题 144 TextView tvTitle = (TextView)view.findViewById(R.id.newstitle); 145 tvTitle.setText(newsItems.get(position).getTitle()); 146 //新闻内容 147 TextView tvContent = (TextView)view.findViewById(R.id.newscontent); 148 tvContent.setText(newsItems.get(position).getContent()); 149 150 return view; 151 } 152 153 /** 154 * 添加数据列表项 155 * @param newsitem 156 */ 157 public void addNewsItem(News newsitem){ 158 newsItems.add(newsitem); 159 } 160 161 } 162 163 }
通过以上的代码就可以实现下拉加载的效果了,显示效果如下图所示。当点击查看更多时listview会在后面加载10条记录,直到记录加载完毕,加载按钮会消失,并且提示用户已经加载完毕。


浙公网安备 33010602011771号