自己的項目當中遇到了這樣一個問題,列表是動態加載的,而且listview的每個item上有動態生成的按鈕,當點擊按鈕後會進行一系列操作,然後改變當前當前列表而不跳轉,具體情況如下:
我這裏獲取到了一個設備列表:
設備列表中的每一項都有一個“修正”按鈕,當點擊修正以後,問題列表中的問題會自動減少一些,而頁面不跳轉。
之前我的設計方案是,修正後,跳轉到當前頁面,並傳遞所需要的參數,代碼如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
if(convertView==null) {
holder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.problem_checklist_item, null);
holder.position1 = (TextView) convertView.findViewById(R.id.position1);
holder.position2 = (TextView) convertView.findViewById(R.id.position2);
holder.standardName = (TextView) convertView.findViewById(R.id.checkstandard);
holder.modifyBtn = (Button) convertView.findViewById(R.id.modify_btn);
//data.get(position).get("");
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
System.out.println("position----------------->"+position);
holder.position1.setText((String)data.get(position).get("dept1"));
holder.position2.setText((String)data.get(position).get("dept2"));
holder.standardName.setText((String)data.get(position).get("checkStandard"));
HashMap<String,Object> map = data.get(position);
final int p = position;
//data.remove(position);
final String id = (String)map.get("id");
final String equipId = (String)map.get("equipId");
final String equipNo = (String)map.get("equipNo");
holder.modifyBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 修改檢查結果
System.out.println("id--------------------->"+id);
RealCheckDBManager manager = new RealCheckDBManager(context);
String code = manager.getResultCode("優");
String deptId = manager.getDeptId(id);
String checkDate = manager.getCheckDate(id);
String checkNum = manager.getCheckNum(id);
manager.setDetailScore(code, id);
String goodcode = manager.getResultCode("優");
String checkId = manager.getCheckId(id);
// 遍歷Z_CHECK_SCORE_DETAIL表,查看是否都爲OK,若是,這把Z_CHECK_SCORE的相應字段也置爲OK
detailList = manager.getCheckDetailList(checkId);
boolean isOk = true;
for(CheckScoreDetailInfo info : detailList) {
if(!goodcode.equals(info.getCheckResult())) {
isOk = false;
break;
}
}
if(isOk) {
manager.setScore("", goodcode, checkId);
}
Toast.makeText(context, "修改成功!", Toast.LENGTH_LONG).show();
Intent intent = new Intent(context,RealCheckProblemListActivity.class);
// 根據ID獲取Z_CHECK_SCORE表的信息
intent.putExtra("deptId", deptId);
intent.putExtra("checkDate", checkDate);
intent.putExtra("checkNum", checkNum);
intent.putExtra("id", checkId);
intent.putExtra("equipId", equipId);
intent.putExtra("equipNo", equipNo);
context.startActivity(intent);
RealCheckProblemListActivity activity = (RealCheckProblemListActivity)context;
activity.finish();
}
});
return convertView;
}
其實這樣做不是不可以,但是用戶體驗就比較差了,應該明顯有一個頁面跳轉的動作在裏面,一下子就看出來了,而且如果傳遞的參數較多,頁面的OnCreate方法中做的事情過多就會進一步延遲速度,破壞用戶體驗,因此應該尋找更好的替代方案。
ListView的顯示一般都是通過Adapter來加載數據的,那麼Adapter就天然的爲我們提供了一個好的方法,就是notifyDataSetChanged(),只要在數據發生改變後,主動調用該方法那麼就可以實現當前頁面數據的改變而不用調整頁面,這個效果有點類似Web開發中的AJAX技術的感覺,滿滿的AJAX即視感啊,代碼如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
if(convertView==null) {
holder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.problem_checklist_item, null);
holder.position1 = (TextView) convertView.findViewById(R.id.position1);
holder.position2 = (TextView) convertView.findViewById(R.id.position2);
holder.standardName = (TextView) convertView.findViewById(R.id.checkstandard);
holder.modifyBtn = (Button) convertView.findViewById(R.id.modify_btn);
//data.get(position).get("");
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
System.out.println("position----------------->"+position);
holder.position1.setText((String)data.get(position).get("dept1"));
holder.position2.setText((String)data.get(position).get("dept2"));
holder.standardName.setText((String)data.get(position).get("checkStandard"));
HashMap<String,Object> map = data.get(position);
final int p = position;
//data.remove(position);
final String id = (String)map.get("id");
final String equipId = (String)map.get("equipId");
final String equipNo = (String)map.get("equipNo");
holder.modifyBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 修改檢查結果
System.out.println("id--------------------->"+id);
RealCheckDBManager manager = new RealCheckDBManager(context);
String code = manager.getResultCode("優");
String deptId = manager.getDeptId(id);
String checkDate = manager.getCheckDate(id);
String checkNum = manager.getCheckNum(id);
manager.setDetailScore(code, id);
String goodcode = manager.getResultCode("優");
String checkId = manager.getCheckId(id);
// 遍歷Z_CHECK_SCORE_DETAIL表,查看是否都爲OK,若是,這把Z_CHECK_SCORE的相應字段也置爲OK
detailList = manager.getCheckDetailList(checkId);
boolean isOk = true;
for(CheckScoreDetailInfo info : detailList) {
if(!goodcode.equals(info.getCheckResult())) {
isOk = false;
break;
}
}
if(isOk) {
manager.setScore("", goodcode, checkId);
}
Toast.makeText(context, "修改成功!", Toast.LENGTH_LONG).show();
<span style="background-color: rgb(255, 255, 51);">data.remove(p);</span> // 數據改變
<span style="background-color: rgb(255, 255, 51);">notifyDataSetChanged();</span> // 通知數據已經改變
}
});
return convertView;
}
@Override
public void notifyDataSetChanged() {
// TODO Auto-generated method stub
super.notifyDataSetChanged();
}
這樣就可以了。