Android Listview 分页加载数据(滑到底部加载)
2015-10-23 19:33
585 查看
由于例子大部分内容都过于基础,只是多了一个滑动的判断,所以,直接上代码
首先,主布局:
子Items
底部更多加载布局
自定义适配器
主Activity
首先,主布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </RelativeLayout>
子Items
<?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" > <TextView android:id="@+id/textview" android:text="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
底部更多加载布局
<?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" > <Button android:id="@+id/more" android:text="More" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
自定义适配器
package com.example.pullloadingmore; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class MyAdatpter extends BaseAdapter { private static Map<Integer,View> m=new HashMap<Integer,View>(); private List<String> items; private LayoutInflater inflater; public MyAdatpter(List<String> items, Context context) { super(); this.items = items; this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return items.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return items.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View contentView, ViewGroup arg2) { // TODO Auto-generated method stub contentView=m.get(position); if(contentView==null){ contentView=inflater.inflate(R.layout.items, null); TextView text=(TextView) contentView.findViewById(R.id.textview); text.setText(items.get(position)); } m.put(position, contentView); return contentView; } public void addItem(String item) { items.add(item); } }
主Activity
package com.example.pullloadingmore; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity implements OnScrollListener { List<String> items = new ArrayList<String>(); private ListView listView; private int visibleLastIndex = 0; //最后的可视项索引 private int visibleItemCount; // 当前窗口可见项总数 private MyAdatpter adapter; private View loadMoreView; private Button loadMoreButton; private Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadMoreView = getLayoutInflater().inflate(R.layout.more, null); loadMoreButton = (Button) loadMoreView.findViewById(R.id.more); loadMoreButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub loadMoreButton.setText("正在加载..."); //设置按钮文字loading handler.postDelayed(new Runnable() { @Override public void run() { loadData(); adapter.notifyDataSetChanged(); //数据集变化后,通知adapter listView.setSelection(visibleLastIndex - visibleItemCount + 1); //设置选中项 loadMoreButton.setText("加载更多"); //恢复按钮文字 } }, 1000); } }); listView = (ListView) this.findViewById(R.id.listView); listView.addFooterView(loadMoreView); //设置列表底部视图 // listView.addHeaderView(v) //设置列表顶部视图 initAdapter(); listView.setAdapter(adapter); //自动为id是list的ListView设置适配器 listView.setOnScrollListener(this); //添加滑动监听 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { // TODO Auto-generated method stub Toast.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 MyAdatpter(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..."); loadData(); adapter.notifyDataSetChanged(); } } /** * 模拟加载数据 */ private void loadData() { int count = adapter.getCount(); for (int i = count; i < count + 20; i++) { adapter.addItem(String.valueOf(i + 1)); } } }
相关文章推荐
- Android模拟产生事件
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- Android studio 利用gradle快速编译出apk
- android自定义RatingBar
- ubuntu14下编译android jrtplib
- 【Android先进】查看手机记忆库状态和应用方法
- Android从服务器获取.9图片失效处理
- Scrollview嵌套Listview出现的问题
- EventBus-再也不用什么Handler了
- android访问数据库时报runtiameException,和空指针异常
- Android沉浸式状态栏、导航栏
- ViewPager图片轮播
- Android Notification详解——响应notification事件
- Android Studio 混淆出现can't find referenced method 的解决方法
- android 版本在线更新
- Android内存泄漏检测-LeakCanary
- 学习笔记_Android之常见四种点击事件的实现方法
- Android控件:自定义View和ViewGroup相关
- Ant自动编译打包&发布 android项目
- Android控件默认风格解析之SeekBar