ListView详解

一、ListView组件介绍

列表视图是Android中最为常用的一种视图组件,它以垂直列表的方式列出需要显示的列表项。



二、基本的XML配置


三、使用

public class MainActivity extends Activity implements OnItemClickListener{
	private ListView lv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv = (ListView) findViewById(R.id.listView);
		lv.setOnItemClickListener(this);
		
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	//ListView
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		
		System.out.println("parent = "+parent.getClass());
		System.out.println("view = "+view.getClass());
		System.out.println("position = "+position);
		System.out.println("id = "+id);	
	}
}




解析

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

parent:ListView

view :每个列表项

position:位置

id:编号

四、ListActivity

继承Activity,提供了一个列表项的视图来显示数据,可以绑定指定的数据源,比如数组或数据库游标,

事件处理onListItemClick

public class MainActivity2 extends ListActivity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		String[] names = { " ", "", "", "" };

		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1, names);
		
		setListAdapter(adapter);
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
	}

}

如果页面只有一个ListView,可以用另一种方式来显示。不需要写布局。

即super.onCreate();  不需要setContent;

五、单选和多选模式

例子随一添加

设置单选布局

ArrayAdapter<String>adapter=new

ArrayAdapter<String>(this,android.R.layout.simple_single_choice,arr)

设置单选模式

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

lv.setAdapter(adapter);

多选:

 simple_multiple_choice

CHOICE_MODE_MULTIPLE

public class MainActivity3 extends Activity implements OnItemClickListener{
	
	private ListView lv;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.main3);
		lv = (ListView) findViewById(R.id.listView1);
		
		String[] citys = {"","","",""};
		
		
//		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice,citys);
	
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,citys);
		
		
//		lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
		
		lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
		
		lv.setAdapter(adapter);
		
		lv.setOnItemClickListener(this);
	}


	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		System.out.println(view.getClass());
	}
}

六、使用SimpleAdapter建立复杂列表项,实现图文列表

public class MainActivity4 extends Activity {

	private ListView lv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main4);
		lv = (ListView) findViewById(R.id.listView1);

		// 一个列表项内容
		Map<String, Object> item1 = new HashMap<String, Object>();
		item1.put("image", R.drawable.jsb_j);
		item1.put("name", "王");

		// 一个列表项内容
		Map<String, Object> item2 = new HashMap<String, Object>();
		item2.put("image", R.drawable.jsb_j);
		item2.put("name", "李");
		
		List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
		data.add(item1);
		data.add(item2);

		SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.main_item,
				new String[]{"image","name"}, new int[]{R.id.imageView1,R.id.textView1});
		
		lv.setAdapter(sa);
	}
}
</pre><pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:gravity="center">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>
 

SimpleAdapter

(Contextcontext,List<?extends Map(String,?)>data, int resource, String[]from,int[]to)

参数:

context:SimpleAdapter关联的View的运行环境。

data:一个Map组成的List,在列表中的每个条目对应列表中的一行,每一个Map中应该包含所有在from参数中指定的键。

resource:一个定义列表项的布局文件的资源ID

from:一个将被添加到Map映射上的键名

to:将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView

七、自定义Adapter

使用BaseAdapter实现更灵活的列表,需要自己写一个适配器继承该类

public class MainActivity5 extends Activity {
	private ListView lv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main5);
		lv = (ListView) findViewById(R.id.listView1);
		lv.setAdapter(new MyAdapter());

	}

	// 定义的数据
	private int[] images = { R.drawable.jsb_j, R.drawable.jsb_j,
			R.drawable.jsb_j, R.drawable.jsb_j, R.drawable.jsb_j,
			R.drawable.jsb_j, R.drawable.jsb_j, R.drawable.jsb_j,
			R.drawable.jsb_j, R.drawable.jsb_j, R.drawable.jsb_j,
			R.drawable.jsb_j };
	private String[] names = { "小", "大", "王", "张", "白", "刘",
			"孔", "名", "类", "张", "就", "但" };

	// 自定义适配器
	class MyAdapter extends BaseAdapter {
		// 获取列表项的总数
		@Override
		public int getCount() {
			return names.length;
		}

		// 获取每一个列表项
		@Override
		public Object getItem(int position) {
			return names[position];
		}

		// 获取每个列表项的ID
		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
//			System.out.println("position=" + position);
//			System.out.println(convertView);
//			System.out.println("------------------------");
			if(convertView==null){
				//创建View
				convertView = getLayoutInflater().inflate(R.layout.main5_item, null);
				ViewHolder vh = new ViewHolder();
				vh.iv = (ImageView) convertView.findViewById(R.id.imageView1);
				vh.tv = (TextView) convertView.findViewById(R.id.textView1);
				convertView.setTag(vh);
				vh.iv.setImageResource(images[position]);
				vh.tv.setText(names[position]);
			}else{
				ViewHolder vh = (ViewHolder)convertView.getTag();
				vh.iv.setImageResource(images[position]);
				vh.tv.setText(names[position]);
			}
//			System.out.println(convertView);
//			ImageView iv = (ImageView) convertView.findViewById(R.id.imageView1);
//			TextView tv = (TextView) convertView.findViewById(R.id.textView1);

//			iv.setImageResource(images[position]);
//			tv.setText(names[position]);

			return convertView;
		}

	}
	
	
	static class ViewHolder{
		ImageView iv;
		TextView tv;
	}

}

八、ListView优化

当name为2个时,打印出的position为position=0,position=1,循环出现四次

当name为多个,如12个时,打印出position为position=0,position=1,...positon=6.循环出现四次

打印出0到6是因为屏幕上显示最多为7个view,循环四次是因为ListView的属性height是wrap_content,为相对值,所以listView每次加载一个组件Textview或ImageView,它的宽和高都要重新绘制。所以调用四遍getview才确定下来。

改为: layout_height="fill_parent"的话只一遍调用getview。

由于每次加载view都会生成新对象,可能会造成系统内存溢出,不稳定。需要使用以下方法优化。

1,重复使用convertView;

2,使用ViewHolder提高在容器中查找组件的效率;

convertview的原理类似于电梯,可以重复利用view,上例屏幕算上顶底部的两个半个view,故最多8个view就可以循环显示了。通过打印出每个position对应的convertview,观察position可以得到第1个对象与第9个convertview的内存地址一样,第2个与第10个一样...循环利用。故添加上判断convertview是否为空的判断达到重复利用的目的。

ImageView和TextView都是通过convertView.findViewById来得到,组件较多的话每次需要在布局文件中比较查找。效率较低,使用ViewHolder提高容器中查找效率。

九、ListView加载分页

1,当前Activity implements OnScrollListener

2,  实现接口的方法

3listView注册滚动监听

4Adapter中添加增加数据的函数

5,获得2页以后的数据后,adapter增加数据,并刷新

————notifyDataSetChanged();

<pre name="code" class="html">public class MyAdapter extends BaseAdapter {
	ArrayList<ApkEntity> apk_list;
	LayoutInflater inflater;

	public MyAdapter(Context context, ArrayList<ApkEntity> apk_list) {
		this.apk_list = apk_list;
		this.inflater = LayoutInflater.from(context);
	}

	public void onDateChange(ArrayList<ApkEntity> apk_list) {
		this.apk_list = apk_list;
		this.notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return apk_list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return apk_list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ApkEntity entity = apk_list.get(position);
		ViewHolder holder;
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = inflater.inflate(R.layout.item_layout, null);
			holder.name_tv = (TextView) convertView
					.findViewById(R.id.item3_apkname);
			holder.des_tv = (TextView) convertView
					.findViewById(R.id.item3_apkdes);
			holder.info_tv = (TextView) convertView
					.findViewById(R.id.item3_apkinfo);
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder) convertView.getTag();
		}
		holder.name_tv.setText(entity.getName());
		holder.des_tv.setText(entity.getDes());
		holder.info_tv.setText(entity.getInfo());
		return convertView;
	}

	class ViewHolder {
		TextView name_tv;
		TextView des_tv;
		TextView info_tv;
	}
}

public class MainActivity extends Activity implements ILoadListener{
	ArrayList<ApkEntity> apk_list = new ArrayList<ApkEntity>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		getData();
		showListView(apk_list);
	}

	MyAdapter adapter;
	LoadListView listview;
	private void showListView(ArrayList<ApkEntity> apk_list) {
		if (adapter == null) {
			listview = (LoadListView) findViewById(R.id.listview);
			listview.setInterface(this);
			adapter = new MyAdapter(this, apk_list);
			listview.setAdapter(adapter);
		} else {
			adapter.onDateChange(apk_list);
		}
	}

	private void getData() {
		for (int i = 0; i < 10; i++) {
			ApkEntity entity = new ApkEntity();
			entity.setName("测试程序");
			entity.setInfo("50w用户");
			entity.setDes("这是一个神奇的应用!");
			apk_list.add(entity);
		}
	}
	private void getLoadData() {
		for (int i = 0; i < 2; i++) {
			ApkEntity entity = new ApkEntity();
			entity.setName("更多程序");
			entity.setInfo("50w用户");
			entity.setDes("这是一个神奇的应用!");
			apk_list.add(entity);
		}
	}
	@Override
	public void onLoad() {
		// TODO Auto-generated method stub
		// 可以加个延时的效果
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//获取更多数据
				getLoadData();
				//更新listview显示;
				showListView(apk_list);
				//通知listview加载完毕
				listview.loadComplete();
			}
		}, 2000);
	}
}

public class LoadListView extends ListView implements OnScrollListener {
View footer;// 底部布局;
int totalItemCount;// 总数量;
int lastVisibleItem;// 最后一个可见的item;
boolean isLoading;// 正在加载;
ILoadListener iLoadListener;
public LoadListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initView(context);
}


public LoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView(context);
}


public LoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initView(context);
}


/**
* 添加底部加载提示布局到listview
* 
* @param context
*/
private void initView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.footer_layout, null);
//刚进去应用需要把加载提示设为隐藏
footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
this.addFooterView(footer);
//初始化设置滚动监听
this.setOnScrollListener(this);
}


@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
this.lastVisibleItem = firstVisibleItem + visibleItemCount;
this.totalItemCount = totalItemCount;
}


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
//监听滚动到最低端并且滚动停止
if (totalItemCount == lastVisibleItem
&& scrollState == SCROLL_STATE_IDLE) {
if (!isLoading) {
isLoading = true;
footer.findViewById(R.id.load_layout).setVisibility(
View.VISIBLE);
// 加载更多
iLoadListener.onLoad();
}
}
}
/**
* 加载完毕
*/
public void loadComplete(){
isLoading = false;
footer.findViewById(R.id.load_layout).setVisibility(
View.GONE);
}

public void setInterface(ILoadListener iLoadListener){
this.iLoadListener = iLoadListener;
}
//加载更多数据的回调接口
public interface ILoadListener{
public void onLoad();
}
}


 

九、ListView下拉刷新

一、添加顶部下拉加载界面

即ListView的header头布局

二、监听ListView滚动事件来判断当前是否显示在ListView的最顶部

即onScrollListener()事件

三、因为顶部下拉加载界面是跟随手势滑动状态不断改变界面显示的,所以需要监听ListView的onTouch()事件,来改变当前状态及界面显示。

四、加载最新数据

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

import com.example.listviewfrashdemo1.R;
import com.imooc.listviewfrashdemo1.ReFlashListView.IReflashListener;
/**
 * ListView下拉刷新
 * @author 
 *
 */
public class MainActivity extends Activity implements IReflashListener{
	ArrayList<ApkEntity> apk_list;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setData();
		showList(apk_list);
	}

	MyAdapter adapter;
	ReFlashListView listview;
	private void showList(ArrayList<ApkEntity> apk_list) {
		if (adapter == null) {
			listview = (ReFlashListView) findViewById(R.id.listview);
			listview.setInterface(this);
			adapter = new MyAdapter(this, apk_list);
			listview.setAdapter(adapter);
		} else {
			adapter.onDateChange(apk_list);
		}
	}

	private void setData() {
		apk_list = new ArrayList<ApkEntity>();
		for (int i = 0; i < 10; i++) {
			ApkEntity entity = new ApkEntity();
			entity.setName("默认数据");
			entity.setDes("这是一个神奇的应用");
			entity.setInfo("50w用户");
			apk_list.add(entity);
		}
	}

	private void setReflashData() {
		for (int i = 0; i < 2; i++) {
			ApkEntity entity = new ApkEntity();
			entity.setName("刷新数据");
			entity.setDes("这是一个神奇的应用");
			entity.setInfo("50w用户");
			apk_list.add(0,entity);
		}
	}
	@Override
	public void onReflash() {
		// TODO Auto-generated method stub\
		//正常程序一般通过网络获取数据,不需要加延时
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//获取最新数据
				setReflashData();
				//通知界面显示
				showList(apk_list);
				//通知listview 刷新数据完毕
				listview.reflashComplete();
			}
		}, 2000);
	}
}

public class MyAdapter extends BaseAdapter {
	ArrayList<ApkEntity> apk_list;
	LayoutInflater inflater;

	public MyAdapter(Context context, ArrayList<ApkEntity> apk_list) {
		this.apk_list = apk_list;
		this.inflater = LayoutInflater.from(context);
	}

	public void onDateChange(ArrayList<ApkEntity> apk_list) {
		this.apk_list = apk_list;
		this.notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return apk_list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return apk_list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ApkEntity entity = apk_list.get(position);
		ViewHolder holder;
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = inflater.inflate(R.layout.item_layout, null);
			holder.name_tv = (TextView) convertView
					.findViewById(R.id.item3_apkname);
			holder.des_tv = (TextView) convertView
					.findViewById(R.id.item3_apkdes);
			holder.info_tv = (TextView) convertView
					.findViewById(R.id.item3_apkinfo);
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder) convertView.getTag();
		}
		holder.name_tv.setText(entity.getName());
		holder.des_tv.setText(entity.getDes());
		holder.info_tv.setText(entity.getInfo());
		return convertView;
	}

	class ViewHolder {
		TextView name_tv;
		TextView des_tv;
		TextView info_tv;
	}
}

public class ReFlashListView extends ListView implements OnScrollListener {
	View header;// 顶部布局文件;
	int headerHeight;// 顶部布局文件的高度;
	int firstVisibleItem;// 当前第一个可见的item的位置;
	int scrollState;// listview 当前滚动状态;
	boolean isRemark;// 标记,当前是在listview最顶端摁下的;
	int startY;// 摁下时的Y值;

	int state;// 当前的状态;
	final int NONE = 0;// 正常状态;
	final int PULL = 1;// 提示下拉状态;
	final int RELESE = 2;// 提示释放状态;
	final int REFLASHING = 3;// 刷新状态;
	IReflashListener iReflashListener;//刷新数据的接口
	public ReFlashListView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	public ReFlashListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	public ReFlashListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	/**
	 * 初始化界面,添加顶部布局文件到 listview
	 * 
	 * @param context
	 */
	private void initView(Context context) {
		LayoutInflater inflater = LayoutInflater.from(context);
		//获取顶部布局文件header
		header = inflater.inflate(R.layout.header_layout, null);
        //通知父布局占用的宽高
		measureView(header);
		headerHeight = header.getMeasuredHeight();
		Log.i("tag", "headerHeight = " + headerHeight);
		topPadding(-headerHeight);
		//添加到ListView的顶部文件
		this.addHeaderView(header);
		this.setOnScrollListener(this);
	}

	/**
	 * 通知父布局,占用的宽,高;
	 * 
	 * @param view
	 */
	private void measureView(View view) {
		ViewGroup.LayoutParams p = view.getLayoutParams();
		if (p == null) {
			p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
					ViewGroup.LayoutParams.WRAP_CONTENT);
		}
		int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);
		int height;
		int tempHeight = p.height;
		if (tempHeight > 0) {
			height = MeasureSpec.makeMeasureSpec(tempHeight,
					MeasureSpec.EXACTLY);
		} else {
			height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
		}
		view.measure(width, height);
	}

	/**
	 * 设置header 布局上边距;
	 * 
	 * @param topPadding
	 */
	private void topPadding(int topPadding) {
		header.setPadding(header.getPaddingLeft(), topPadding,
				header.getPaddingRight(), header.getPaddingBottom());
		header.invalidate();
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		this.firstVisibleItem = firstVisibleItem;
	}

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

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			if (firstVisibleItem == 0) {
				//在最顶端
				isRemark = true;
				startY = (int) ev.getY();
			}
			break;

		case MotionEvent.ACTION_MOVE:
			onMove(ev);
			break;
		case MotionEvent.ACTION_UP:
			if (state == RELESE) {
				state = REFLASHING;
				// 加载最新数据;
				reflashViewByState();
				iReflashListener.onReflash();
			} else if (state == PULL) {
				state = NONE;
				isRemark = false;
				reflashViewByState();
			}
			break;
		}
		return super.onTouchEvent(ev);
	}

	/**
	 * 判断移动过程操作;
	 * 
	 * @param ev
	 */
	private void onMove(MotionEvent ev) {
		if (!isRemark) {
			return;
		}
		int tempY = (int) ev.getY();
		int space = tempY - startY;
		int topPadding = space - headerHeight;
		switch (state) {
		case NONE:
			if (space > 0) {
				state = PULL;
				reflashViewByState();
			}
			break;
		case PULL:
			topPadding(topPadding);
			if (space > headerHeight + 30
					&& scrollState == SCROLL_STATE_TOUCH_SCROLL) {
				state = RELESE;
				reflashViewByState();
			}
			break;
		case RELESE:
			topPadding(topPadding);
			if (space < headerHeight + 30) {
				state = PULL;
				reflashViewByState();
			} else if (space <= 0) {
				state = NONE;
				isRemark = false;
				reflashViewByState();
			}
			break;
		}
	}

	/**
	 * 根据当前状态,改变界面显示;
	 */
	private void reflashViewByState() {
		TextView tip = (TextView) header.findViewById(R.id.tip);
		ImageView arrow = (ImageView) header.findViewById(R.id.arrow);
		ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);
		RotateAnimation anim = new RotateAnimation(0, 180,
				RotateAnimation.RELATIVE_TO_SELF, 0.5f,
				RotateAnimation.RELATIVE_TO_SELF, 0.5f);
		anim.setDuration(500);
		anim.setFillAfter(true);
		RotateAnimation anim1 = new RotateAnimation(180, 0,
				RotateAnimation.RELATIVE_TO_SELF, 0.5f,
				RotateAnimation.RELATIVE_TO_SELF, 0.5f);
		anim1.setDuration(500);
		anim1.setFillAfter(true);
		switch (state) {
		case NONE:
			arrow.clearAnimation();
			topPadding(-headerHeight);
			break;

		case PULL:
			arrow.setVisibility(View.VISIBLE);
			progress.setVisibility(View.GONE);
			tip.setText("下拉可以刷新!");
			arrow.clearAnimation();
			arrow.setAnimation(anim1);
			break;
		case RELESE:
			arrow.setVisibility(View.VISIBLE);
			progress.setVisibility(View.GONE);
			tip.setText("松开可以刷新!");
			arrow.clearAnimation();
			arrow.setAnimation(anim);
			break;
		case REFLASHING:
			topPadding(50);
			arrow.setVisibility(View.GONE);
			progress.setVisibility(View.VISIBLE);
			tip.setText("正在刷新...");
			arrow.clearAnimation();
			break;
		}
	}

	/**
	 * 获取完数据;
	 */
	public void reflashComplete() {
		state = NONE;
		isRemark = false;
		reflashViewByState();
		TextView lastupdatetime = (TextView) header
				.findViewById(R.id.lastupdate_time);
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
		Date date = new Date(System.currentTimeMillis());
		String time = format.format(date);
		lastupdatetime.setText(time);
	}
	
	public void setInterface(IReflashListener iReflashListener){
		this.iReflashListener = iReflashListener;
	}
	/**
	 * 刷新数据接口
	 * @author Administrator
	 */
	public interface IReflashListener{
		public void onReflash();
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值