Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android如何在BaseAdapter內使用notifyDataSetChanged()方法以及線程的使用

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

編輯:關於Android編程

有時候我們需要修改列表裡的數據,並實時刷新,我們除了在在外部調用adapter.notifyDataSetChanged()方法來通知activity刷新, 如果在adapter內部有涉及到更新數據,刪除或者增加數據,就可以直接在adapter內部調用notifyDataSetChanged()這個方法,前提是該listview綁定的數據有改變。


以下例子結合Handler,線程展示


public class MyAdapter extends BaseAdapter {
	private final static String tag = "MyAdapter";
	private List 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 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進行操作,

要在BaseAdapter內進行通知刷新,關鍵在於一句 .this.notifyDataSetChanged();

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進行操作了,這就是異步操作


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved