android如何在BaseAdapter内使用notifyDataSetChanged()方法以及线程的使用

有时候我们需要修改列表里的数据,并实时刷新,我们除了在在外部调用adapter.notifyDataSetChanged()方法来通知activity刷新,  如果在adapter内部有涉及到更新数据,删除或者增加数据,就可以直接在adapter内部调用notifyDataSetChanged()这个方法,前提是该listview绑定的数据有改变。

以下例子结合Handler,线程展示

public class MyAdapter extends BaseAdapter {
	private final static String tag = "MyAdapter";
	private List<Alarm> alarms;
	private static final int MODIFY_FAIL = 13;
	private static final int MODIFY_SUCCESS = 12;
	private static final int DELETE_SUCCESS= 10;
	private static final int STUDY_SUCCESS = 11;
	private Context context;
	private LayoutInflater inflater;
	private TextView tvDeviceName;
	int msgType;
	private Alarm alarm;
	private Dialog confirmDlg;
	// BaseHandler baseHandler;
	public MyAdapter(Context context, List<Alarm> alarms) {
		// TODO Auto-generated constructor stub
		this.context = context;
		this.alarms = alarms;
		inflater = LayoutInflater.from(context);
	}

	.......

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

		alarm = alarms.get(position);
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.alarm_manage_item, parent,
					false);

		}
		tvDeviceName = (TextView) convertView.findViewById(R.id.tv_device_name);
		tvDeviceName.setText(alarm.getName());
		.......

		return convertView;
	}

由于代码太多,中间部分省略了

以下是Handler部分,通过Handler,Thread,Message可进行异步操作 ,记住,在Handler的CallBack()方法内不能对UI进行操作,但是可以发送一个空消息到消息队列

contextHandler.sendEmptyMessage(MODIFY_FAIL);

,这样

handleMessage()方法就能够处理消息队列中的消息了,在这个方法里面可对UI进行操作,

</pre><p></p><h5>要在BaseAdapter内进行通知刷新,关键在于一句 .this.notifyDataSetChanged();</h5><pre name="code" class="java">
</pre><p></p><p></p><pre name="code" class="java">private BaseHandler contextHandler = new BaseHandler(context) {
		@Override
		public void callBack(String recvHex) {
			// TODO Auto-generated method stub
			super.callBack(recvHex);
			recvHex = recvHex.toUpperCase().trim();
			String[] strs = recvHex.split(" ");
			msgType = OutPutProtocol.analysisOutPutOperInfo(recvHex);
			// 修改名称应答
			if (DeviseSettingProtocol.modifyDeviceNameMsg(recvHex) == Resp.Rst_Success) {
				if(strs[3].equals("00"))
				{
				SettingThread thread = new SettingThread(
						contextHandler,// 返回结果handler
						context, SettingThread.OperType_EditAlarm, alarm);
				thread.start();
				ProgressDialog.dismissProgressDialog();
				}
				else if(strs[3].equals("02")||strs[3].equals("FF"))
				{
					contextHandler.sendEmptyMessage(MODIFY_FAIL);//将一个空消息送到消息队列
				}
			}
	}

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);

			switch (msg.what) {
			//修改名称失败
			case MODIFY_FAIL:
			{
				Toast.makeText(context, "修改失败", Toast.LENGTH_SHORT).show();
			}
			case Resp.Rst_Fail:
			{
				Toast.makeText(context, "删除失败", Toast.LENGTH_SHORT).show();
			}
			case SettingThread.OperType_DelAlarm:
			{
				MyAdapter.this.notifyDataSetChanged();
				Toast.makeText(context, "删除成功!",
						Toast.LENGTH_SHORT).show();
			}
			case SettingThread.OperType_EditAlarm:
			{
				MyAdapter.this.notifyDataSetChanged();
				Toast.makeText(context, "修改成功!",
						Toast.LENGTH_SHORT).show();
			}
			default:
				break;
			}
		}

	};
// 通过线程删除数据库中的数据
				SettingThread thread = new SettingThread(
						contextHandler,// 返回结果handler
						context, SettingThread.OperType_DelAlarm, alarm);
				thread.start();

线程机制,将Handler和一个标识符

SettingThread.OperType_DelAlarm

传到线程里,在该线程执行耗时操作,并将操作用Msg送到消息队列,然后返回给UI线程,这时UIActivity的Handler就可以取出消息队列中的消息(对应的标识符),然后就可以对UI进行操作了,这就是异步操作

android如何在BaseAdapter内使用notifyDataSetChanged()方法以及线程的使用

时间: 2024-10-12 03:12:44

android如何在BaseAdapter内使用notifyDataSetChanged()方法以及线程的使用的相关文章

Android源码与设计模式之notifyDataSetChanged()方法与观察者模式

BaseAdapter在调用notifyDataSetChanged()方法后,GridView就刷新了,下面从源码角度对此原理进行剖析. 首先进到BaseAdapter中查看其notifyDataSetChanged()方法,发现它调用了DataSetObservable的notifyChanged()方法 public abstract class BaseAdapter{ private final DataSetObservable mDataSetObservable = new Da

android使用notifyDataSetChanged()方法,listview数据没有更新

android使用notifyDataSetChanged()方法,发现adapter的数据更新了,但是ListView的内容没有更新? 查阅如下网站解决方案都没有解决: http://blog.csdn.net/williamz1980/article/details/5837998 http://15975604853.blog.163.com/blog/static/1182880352012710113831147/ 后来冷静一想,我遇到这个问题的情景跟他们的有所区别: 我的问题是从另个

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android如何在java代码中设置margin

习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom).可是View本身没

Android应用盈利广告平台的嵌入方法详解

一.如何学习Android   android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我只说我个人的学习方法和本人以为的好的步骤.   1.搭建环境:包括对Java和Eclipse及模拟器(有真机再好不过)的熟悉,对于android的tools和adb命令可以放到后面熟悉了解.   2.从helloworld开始:了解一个基本的android应用代码包含哪些,各部分做什么用.(这里只要

Android ListView使用BaseAdapter与ListView的优化

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

百度Android语音识别SDK语义理解与解析方法

百度语义理解开放平台面向互联网开发者提供自然语言文本的解析服务,也就是可以根据文本的意图解析成相应的表示. 为了易于人阅读,同时也方便机器解析和生成,意图表示协议采用 json 语言进行描述,采用 gb18030 编码. json 语言的基本概念: 1.属性名/属性值 即键值对(key-value) 2.数组 在 json 中是"[]"括起来的内容,数据结构为 ["value1","value2",...],取值方式和所有语言中一样,使用索引获取

android如何在textview或edittext上添加表情

先上效果图: 首先来写一个表情的GridView public class EmotionView extends LinearLayout implements OnItemClickListener { private GridView mGridView; private static final ArrayList<Integer> emotionDisplayList = new ArrayList<Integer>(); public static final Link

Android 如何在java/native层修改一个文件的权限(mode)与用户(owner)?

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 如何在java/native层修改一个文件的权限(mode),用户(owner),组(group),以满足安全需要? [Keyword] 文件权限 文件用户 mode owner chomd chown permission [Solution] 在nativ