編輯:關於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進行操作,
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進行操作了,這就是異步操作
相信有很人做的項目估計都用的到這個。就是ListView的下拉刷新上拉加載還有就是列的橫向滾動;PS:橫向滾動帶表頭與固定列(相信蠻多人都有這樣的需求吧?就是在ListV
1、Surface1.1、 就如在C語言編程一樣,通過一個文件的句柄,就可以操作文件,獲取文件的內容。 同樣的,通過Surface就可以獲取raw buffer其中的內容
今天看了pro android 3中menu這一章,對Android的整個menu體系有了進一步的了解,故整理下筆記與大家分享。PS:強烈推薦《Pro Android 3
本文是針對AndBase框架學習整理的第一篇筆記,想要了解AndBase框架的朋友可以閱讀本文,大家共同學習。1.使用AndBase實現多功能標題欄AndBase框架內部