android中listview分页载入数据

前段时间做的新浪微博项目一直想实现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);
	}

	@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.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() {

				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					loadMoreButton.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() {

				@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 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));
	        }
	    }

}

最后看看效果:

时间: 2024-08-25 00:21:22

android中listview分页载入数据的相关文章

Android中ListView分页加载数据-转

Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

Android中ListView分页加载数据

熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容.通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.比如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个“加载更多”按钮,用户点击后,加载

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

Android ListView分页载入(服务端+android端)Demo

Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源码: 服务端: 须要导入图中这几个jar包. 在执行Android端代码前,须要开启服务端: 以下先给出服务端的代码: 类EmpDataSource: package com.andr

listview分页载入问题

方案一: 底部有查看很多其它能够使用HeaderViewListAdapter 假设须要加入数据, 就向Adapter绑定的数据里面加入. 然后调用Adapter.notifyDataSetChanged()方法, ListView会自己主动刷新; public class HeaderViewListAdapter extends Object implements Filterable WrapperListAdapter java.lang.Object    ? android.widg

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能 本文中阐述如何自定义EditText实现搜索框自定义的样式以及挤压字母的思路等 自定义EditText 相关的drawable文件 主界面以及相关的适配器 结果展示 定义要呈现的EditText的样式 public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 定义删

Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

Android中ListView异步加载图片错位.重复.闪烁问题分析及解决方案 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通

Android中ListView分类

<?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:layo

android中listview点击事件失效的灵异事件

首先说明一下我想实现的功能: 点击某个item之后,让其颜色发生变化.如果变化网上有很多例子,我就不班门弄斧了.Listview之所以点击没有反应是因为上图中绿色部分(自己定义的一个继承BaseAdapter的adapter来适应listview)将listview的item覆盖了.现在点击的只是自定义的adapter中的convertView. 其次,自定义的adapter中包含一个ImageView和二个TextView.代码如下: <?xml version="1.0" e