使用ViewSwitcher实现ListView的数据动态加载[学习]
?
ViewSwitcher
译者署名: ivanlee
版本:Android 2.3 r1
?
结构
继承关系
public class ViewSwitcher extends ViewAnimator
?
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ViewAnimator
android.widget.ViewSwitcher
?
已知直接子类 ImageSwitcher, TextSwitcher
?
类概述
在两个视图间转换时显示动画,有一个可以创建这些视图的工厂类。你可以用工厂来创建这些视图,也可以自己创建。一个ViewSwitcher只允许包含两个子视图,且一次仅能显示一个。 (译者注:与ViewFlipper类相似,但该类不常用,常用其两个子类ImageSwitcher:转换图片时增加动画效果; TextSwitcher: 转换文字时增加动画效果; 其实例见apidemos中ImageSwitcher实例和TextSwitcher实例)
?
内部类 interface ViewSwitcher.ViewFactory
在一个ViewSwitcher里创建视图
?
构造函数
public ViewSwitcher (Context context)
构造一个新的空的视图转换器(ViewSwitcher)。
参数
context 应用环境(译者注:应用程序上下文)
?
public ViewSwitcher (Context context, AttributeSet attrs)
构造一个指定上下文、属性集合的空的视图转换器(ViewSwitcher)。
参数
context 应用环境(译者注:应用程序上下文)
attrs 属性集合
?
公共方法
public void addView(View child, int index, ViewGroup.LayoutParams params)
添加一个指定布局参数的子视图
参数
child 添加的子视图
index 添加的子视图的索引
params 子视图的布局参数
异常
IllegalStateException 如果切换器中已经包含了两个视图时。
?
public View getNextView ()
返回下一个要显示的视图
返回
视图切换之后将要显示出的下一个视图
?
public void reset ()
重置视图转换器(ViewSwitcher)来隐藏所有存在的视图,并使转换器达到一次动画都还没有播放的状态。
?
public void setFactory (ViewSwitcher.ViewFactory factory)
设置用来生成将在视图转换器中切换的两个视图的工厂。也可以调用两次 addView(android.view.View, int, android.view.ViewGroup.LayoutParams)来替代使用工厂的方法。
参数
factory 用来生成转换器内容的视图工厂
?
?
实现ListView的数据动态加载DEMO:
效果图:模拟点击LoadMoreItems按钮或得更多数据。
![运用ViewSwitcher实现ListView的数据动态加载[学习]](http://img.reader8.net/uploadfile/jiaocheng/2014017/1441/2014011401415613311.png)
![运用ViewSwitcher实现ListView的数据动态加载[学习]](http://img.reader8.net/uploadfile/jiaocheng/2014017/1441/2014011401415613312.png)
?
代码:
load_more_items.xml:
?
?
?progress_bar.xml:
?
?
?ViewSwitcherExample.java:
?
?
/** * ViewSwitcher 字面意思理解为视图转换开关. * 在两个视图间转换时显示动画,有一个可以创建这些视图的工厂类。你可以用工厂来创建这些视图,也可以自己创建。 * 一个ViewSwitcher只允许包含两个子视图,且一次仅能显示一个。 */public class ViewSwitcherExample extends ListActivity implements OnClickListener {static final String[] ITEMS = new String[]{"List Item 1", "List Item 2","List Item 3", "List Item 4","List Item 5", "List Item 6","List Item 7", "List Item 8","List Item 9", "List Item 10"};private static final String TAG = "ViewSwitcherExample";private ViewSwitcher switcher;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// no window titlerequestWindowFeature(Window.FEATURE_NO_TITLE);//create the ViewSwitcher in the current contextswitcher = new ViewSwitcher(this);//footer Button: see XML1View footer = View.inflate(this, R.layout.load_more_items, null);//progress View: see XML2View processBar = View.inflate(this, R.layout.progress_bar, null);//add the views (first added will show first) switcher.addView(footer); switcher.addView(processBar);//add the ViewSwitcher to the footer getListView().addFooterView(switcher);//add items to the ListView setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ITEMS));}@Overridepublic void onClick(View v) {//first view is showing, show the second progress viewswitcher.showNext(); //显示下一个视图//and start background worknew getMoreItems().execute();Log.i(TAG, Thread.currentThread().getName());}/** Background Task To Get More Items**/private class getMoreItems extends AsyncTask{@Overrideprotected Object doInBackground(Object... params) {//code to add more itemstry {Thread.sleep(3000); //only to demonstrateLog.i(TAG, Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Object result) {//返回上一个视图switcher.showPrevious(); //update the ListView}}}?
?