ApiDemos-->Views-lists-slow adapter学习

今天来依照apidemos提供的方法来实现slow loading的效果.

简单说下实现方法:

实现ListView.OnScrollListener ,监听到手势滑动的情况,当处于滚动状态时,将新显示的items 设置为Loading , 当离开屏幕时,才载入真实的数据.

设置数据时,要用到getFirstVisiblePosition属性来计算应该载入第几个item.

该小demo应该算是学习Android AsyncTask异步载入的基础.

Main.java

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.example.testmyviewslistsactivateitems.R;

/**
 *
 * @author Administrator 仿效果slow loading apiDemos -- Views -Lists - Slow Adapter
 */
public class Main extends ListActivity {

	private boolean mBusy = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setListAdapter(new SlowAdapter(this));
		// 设置选择模式为单选
		getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
		// 首次载入设置选中items
		getListView().setItemChecked(0, true);
		getListView().setOnScrollListener(new OnScrollListener());
	}

	protected class OnScrollListener implements ListView.OnScrollListener {

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			switch (scrollState) {
			//The view is not scrolling.
			case OnScrollListener.SCROLL_STATE_IDLE:
				mBusy = false;
				int first = view.getFirstVisiblePosition();
				int count = view.getChildCount();
				for (int i = 0; i < count; i++) {
					TextView t = (TextView) view.getChildAt(i);
					if (t.getTag() != null) {
						t.setText(mStrings[first + i]);
						t.setTag(null);
					}
				}
				break;
			// The user is scrolling using touch, and their finger is still on the screen
			case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
				mBusy = true;
				break;
		    //The user had previously been scrolling using touch and had performed a fling.
		   //The animation is now coasting to a stop
			case OnScrollListener.SCROLL_STATE_FLING:
				mBusy = true;
				break;
			}
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
		}

	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		getListView().setItemChecked(position, true);
	}

	// 自己定义适配器
	private class SlowAdapter extends BaseAdapter {
		private LayoutInflater mInflater;

		public SlowAdapter(Context context) {
			mInflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public int getCount() {
			return mStrings.length;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			TextView text;

			if (convertView == null) {
				text = (TextView) mInflater.inflate(R.layout.main, null, false);
			} else {
				text = (TextView) convertView;
			}

			if (!mBusy) {
				text.setText(mStrings[position]);
				text.setTag(null);
			} else {
				text.setText("Loading...");
				text.setTag(this);
			}
			return text;
		}

	}

	// data
	public static final String[] mStrings = { "Abbaye de Belloc",
			"Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
			"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu",
			"Airag", "Airedale", "Aisy Cendre", "Allgauer Emmentaler",
			"Alverca", "Ambert", "American Cheese", "Ami du Chambertin",
			"Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
			"Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco",
			"Vendomois", "Vieux Corse", "Vignotte", "Vulscombe",
			"Waimata Farmhouse Blue", "Washed Rind Cheese (Australian)",
			"Waterloo", "Weichkaese", "Wellington", "Wensleydale",
			"White Stilton", "Whitestone Farmhouse", "Wigmore",
			"Woodside Cabecou", "Xanadu", "Xynotyro", "Yarg Cornish",
			"Yarra Valley Pyramid", "Yorkshire Blue", "Zamorano",
			"Zanetti Grana Padano", "Zanetti Parmigiano Reggiano" };
}

代码下载

时间: 2024-11-06 07:12:00

ApiDemos--&gt;Views-lists-slow adapter学习的相关文章

apidemos -&gt;views/lists/Activate items 学习

看apidemos的 activate items 很简单,就是继承ListActivity, 然后给使用了 api 11中一个系统样式的textView. 然而在 API level 11 之前运行会报错.如果在11之前实现 Activateitems给出的效果,那必然要给textView 的background属性设置一个press等状态的xml来,drawable其选中的背景. 然而apidemos 给出的很简单的实现: android:background="?android:attr/

ApiDemos--&gt;Views-lists-slow adapter学习

今天来按照apidemos提供的方法来实现slow loading的效果. 简单说下实现方法: 实现ListView.OnScrollListener ,监听到手势滑动的情况,当处于滚动状态时,将新显示的items 设置为Loading , 当离开屏幕时,才加载真实的数据. 设置数据时,要用到getFirstVisiblePosition属性来计算应该加载第几个item. 该小demo应该算是学习Android AsyncTask异步加载的基础. Main.java import android

listview中的adapter学习小结

概述 Adapter是数据和UI之间的一个桥梁,在listview,gridview等控件中都会使用到,android给我们提拱了4个adapte供我们使用: BaseAdapter是一个抽象类,继承它需要实现较多的方法 ArrayAdapter支持泛型操作,最为简单,只能展示一行字 SimpleAdapter有最好的扩充性,可以自定义出各种效果 SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来.如需要实现更复杂的UI也

adapter学习

一 .ListView 不执行getView()方法 setAdapter 时,首先会执行getCount(),当getCount()  返回的是0时,就不会去执行getView()方法, 如果 开启线程去下载数据,然后在getCount()中返回其size, 开始的时候因为还没有下载数据,返回的size可能是0,所以不会去调用getView()方法,界面就不会被填充.    下载完成后  通过notifyDataSetChanged()方法 重新加载适配器,就会调用getView()方法了.

Django之views.py视图函数学习

视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一个简单的视图: 下面是一个以HTML文档的形式返回当前日期和时间的视图: views.py 1 from django.http import HttpResponse 2 3 import datetime 4 5 def current_datetime(request): 6 7 now =

Apidemos--&gt;Views-Lists-Cursor(people)学习

Apidemos-->Views-Lists-Cursor(people)-主要用到了获取手机联系人信息,属于内容提供者的范畴,要想了解这方面的内容,可以参考官方docs /sdk/docs/guide/topics/providers/content-provider-basics.html 这里简单说下contentprovider; contentprovider可实现不同应用程序之间的数据共享. 它是程序之间进行数据交换的api. 当一个程序需要把自己的数据暴露给其他程序使用时,该应用程

Apidemos--&amp;gt;Views-Lists-Cursor(people)学?

Apidemos-->Views-Lists-Cursor(people)-主要用到了获取手机联系人信息,属于内容提供者的范畴,要想了解这方面的内容,能够參考官方docs /sdk/docs/guide/topics/providers/content-provider-basics.html 这里简单说下contentprovider; contentprovider可实现不同应用程序之间的数据共享. 它是程序之间进行数据交换的api. 当一个程序须要把自己的数据暴露给其它程序使用时,该应用程

Android网络项目课程笔记-----AdapterView嵌套

首页内容: 其他功能使用ListView或GridView ListView.GridView嵌套时,指定高度. 公开课 左:课程分类    ExpandableListView 右:最新发布/最受欢迎   ListView ExpandableListView使用方法参照ApiDemos Views/Expandable/Custom Adapter

使用同步适配器(sync adapter)数据传输

在android设备与webserver之间实现数据同步能显著提高你的应用的有用性.让你的应用更受用户的欢迎. 比方说.你的数据上传给webserver,这就有了一个有用的备份.当用户的设备离线工作时,这时从server下载输数据是非常有用的.有些情况下,用户可能会认为通过网页的同步接口来输入或编辑数据更方便,由于这些数据非常快就从同页上同步过来了,他们也可能想在一段时间内採集数据然后再将数据上传到中央存储区. 虽然你能够自己为你的应用设计一套传输数据系统, 你仍应该考虑使用Android的Sy