`
guochongcan
  • 浏览: 326921 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Listview动态加载数据

 
阅读更多

      最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好。我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间。网上看到了这样一个例子,挺好的,我改动了一下,达到了我想要的结果。

 

package org.developerworks.android;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout.LayoutParams;

public class ListViewForLoading extends Activity implements OnScrollListener {
	private listViewAdapter adapter = new listViewAdapter();
	ListView listView;
	LinearLayout loadingLayout;
	private Thread mThread;
	/** * 设置布局显示属性 */
	private LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
			LinearLayout.LayoutParams.WRAP_CONTENT,
			LinearLayout.LayoutParams.WRAP_CONTENT);
	/** * 设置布局显示目标最大化属性 */
	private LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(
			LinearLayout.LayoutParams.FILL_PARENT,
			LinearLayout.LayoutParams.FILL_PARENT);
	private ProgressBar progressBar;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init() {
		// TODO Auto-generated method stub
		// 线性布局
		LinearLayout layout = new LinearLayout(this);
		// 设置布局 水平方向
		layout.setOrientation(LinearLayout.HORIZONTAL);
		// 进度条
		progressBar = new ProgressBar(this);
		// 进度条显示位置
		progressBar.setPadding(0, 0, 15, 0);
		// 把进度条加入到layout中
		layout.addView(progressBar, mLayoutParams);
		// 文本内容
		TextView textView = new TextView(this);
		textView.setText("加载中...");
		textView.setGravity(Gravity.CENTER_VERTICAL);
		// 把文本加入到layout中
		layout.addView(textView, FFlayoutParams);
		// 设置layout的重力方向,即对齐方式是
		layout.setGravity(Gravity.CENTER);
		// 设置ListView的页脚layout
		loadingLayout = new LinearLayout(this);
		loadingLayout.addView(layout, mLayoutParams);
		loadingLayout.setGravity(Gravity.CENTER);
		// 得到一个ListView用来显示条目
		listView = (ListView) findViewById(R.id.tv);
		// 添加到脚页显示
		listView.addFooterView(loadingLayout);
		// 给ListView添加适配器
		listView.setAdapter(adapter);
		// 给ListView注册滚动监听
		listView.setOnScrollListener(this);
	}

	/**
	 * 要用用于生成显示数据
	 * 
	 * @author huangbq
	 */
	class listViewAdapter extends BaseAdapter {
		int count = 10;

		public int getCount() {
			return count;
		}

		public Object getItem(int pos) {
			return pos;
		}

		public long getItemId(int pos) {
			return pos;
		}

		public View getView(int pos, View v, ViewGroup p) {
			TextView view;
			if (v == null) {
				view = new TextView(ListViewForLoading.this);
			} else {
				view = (TextView) v;
			}
			view.setText("ListItem " + pos);
			view.setTextSize(20f);
			view.setGravity(Gravity.CENTER);
			view.setHeight(60);
			return view;
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		if (firstVisibleItem + visibleItemCount == totalItemCount) {
			// 开线程去下载网络数据
			if (mThread == null || !mThread.isAlive()) {
				mThread = new Thread() {
					@Override
					public void run() {
						try {
							// 这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
							Thread.sleep(5000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						Message message = new Message();
						message.what = 1;
						handler.sendMessage(message);
					}
				};
				mThread.start();
			}
		}
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub
	}

	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch (msg.what) {
			case 1:
				if (adapter.count <= 41) {
					adapter.count += 10;
					int currentPage = adapter.count / 10;
					Toast.makeText(getApplicationContext(),
							"第" + currentPage + "页", Toast.LENGTH_LONG).show();
				} else {
					listView.removeFooterView(loadingLayout);
				}
				// 重新刷新Listview的adapter里面数据
				adapter.notifyDataSetChanged();
				break;
			default:
				break;
			}
		}
	};
}

 

main.xml别忘了加这段了

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ListView android:id="@+id/tv" 
    	android:layout_width="wrap_content" 
    	android:layout_height="wrap_content"/>
</LinearLayout>

 

 

 

分享到:
评论

相关推荐

    ListView动态加载数据分页

    为了解决这些问题,通常会采用“动态加载数据分页”的策略。本文将深入探讨如何使用Handler+线程和AsyncTask两种方法来实现ListView的动态加载分页。 首先,我们来看看Handler+线程的实现方式。在主线程中,我们不...

    C#,winform,listView动态插入数据

    为了能够动态地向`ListView`中添加数据,我们需要完成以下步骤: 1. **创建新的WinForms项目**:打开Visual Studio,创建一个新的Windows Forms App (.NET Framework)项目。 2. **添加ListView控件**:在工具箱中...

    ListView 动态加载数据

    友们在使用ListView的过程中,是否考虑过加载大量的数据时,如何提高显示速度? 朋友你是不是也想对其优化,形成动态加载? 如果你也有过这样的想法,那么我们是同路人! 通过查看ListView的API,我们似乎找不...

    listview实现动态加载

    "ListView实现动态加载"这个主题,涉及到的是如何高效地处理大量数据并根据用户滚动时动态加载更多内容的技术。动态加载通常用于节省内存,提高用户体验,避免一次性加载过多数据导致应用卡顿。 1. **ListView基础*...

    视频案例-3.ListView动态添加数据

    在本视频案例“视频案例-3.ListView动态添加数据”中,我们将深入探讨如何在Android开发环境中,使用ListView组件动态地加载和展示数据。ListView是Android UI设计中的一个重要组成部分,它用于展示大量的数据列表,...

    ListView中动态添加数据

    本篇文章将深入探讨如何在ListView中动态添加数据,这在实际应用中是非常常见且重要的功能。 首先,理解ListView的基本结构至关重要。ListView主要由Adapter驱动,Adapter就像一个桥梁,连接数据源(例如ArrayList...

    实现竖排viewpager+listview动态加载数据

    "实现竖排ViewPager+ListView动态加载数据"这个项目就是针对这种需求的一个实践。 **ViewPager组件**: ViewPager是一个强大的Android视图组件,它允许用户水平滑动浏览多个页面。在本项目中,ViewPager被改造以...

    android ListView 动态追加数据

    动态追加数据是指在ListView已有的内容基础上,根据用户操作或网络数据加载情况,实时添加新的数据项,同时显示追加进度,以提高用户体验。这里我们将深入探讨如何实现这个功能。 首先,我们需要一个ListView实例,...

    android动态加载Listview

    本项目“android动态加载Listview”旨在提供一种更实用、更贴近实际应用场景的数据动态加载解决方案。 首先,我们要理解什么是动态加载。动态加载(也称为懒加载)是在用户滚动ListView时按需加载数据的技术。它...

    ListView视图动态增加与删除控件条目,内容

    在Activity或Fragment中,当需要增加新条目时,调用Adapter的`add()`方法添加数据到数据源,然后调用`notifyDataSetChanged()`通知Adapter数据已改变,ListView会自动刷新并显示新的条目。 4. 实现动态删除: ...

    Android开发中Listview动态加载数据的方法示例

    Android开发中Listview动态加载数据的方法示例主要介绍了Android开发中Listview动态加载数据的方法,结合实例形式较为详细的分析了Android操作ListView界面布局与数据动态更新相关操作技巧。下面是对该方法的详细...

    vb listview动态的加载数据

    综上所述,"vb listview动态的加载数据"这个主题涵盖了一系列与VB编程、ListView控件交互、异步编程、数据加载策略和用户体验相关的技术点。正确理解和运用这些知识点,可以构建出高效、用户友好的数据展示应用。

    android listview 下拉刷新 动态加载数据 图文混排

    本教程将重点讲解如何在ListView中实现下拉刷新和动态加载数据的功能,同时处理图文混排的问题。 首先,我们要引入SwipeRefreshLayout库,它是Android SDK提供的一个下拉刷新框架。在`build.gradle`文件中添加以下...

    ListView动态加载

    在ListView中,不是一次性加载所有数据,而是只加载屏幕可见的部分,当用户滚动时,再按需加载更多数据。这样可以减少内存消耗,提高应用启动速度,尤其是处理大数据集时。 实现ListView动态加载通常有两种方法: ...

    ListView动态添加、移除item

    本篇主要探讨如何动态地添加和移除ListView中的item,以实现一个流畅的用户体验。 一、ListView的基本使用 1. XML布局:在布局文件中创建ListView,并为其指定id,例如`android:id="@+id/list_view"`。 2. 数据源:...

    WPF后台动态绑定ListView数据源

    本示例重点介绍了如何在后台动态地绑定ListView的数据源,以及如何通过代码添加行和列。这将帮助开发者更好地理解WPF中的数据绑定和ListView的使用。 首先,`ListView`的数据源通常是通过`ItemsSource`属性来设置的...

    Android 根据EditText搜索框 ListView动态显示数据

    然后清空adapter,添加过滤后的数据,并调用`notifyDataSetChanged`通知ListView数据已改变,从而实现动态更新。 这就是如何在Android中根据EditText搜索框动态显示ListView数据的基本步骤。使用SimpleAdapter可以...

    ListView动态加载listitem

    ListView是Android平台中一个常用的控件,用于展示大量的数据列表,尤其在数据量大到无法一次性加载全部内容时,动态加载listitem(也称为“懒加载”)就显得尤为重要。这种技术可以显著提高应用的性能,减少内存...

    动态加载ListView且滑动显示提示信息的实现例子

    在Android的ListView中,动态加载(Lazy Loading)是指只在需要时加载数据,而不是一次性加载所有数据到内存中。这样可以避免一次性加载大量数据导致的内存消耗和应用卡顿。通常,我们采用Adapter与ListView结合,当...

Global site tag (gtag.js) - Google Analytics