1. 程式人生 > >Android列表資料動態改變

Android列表資料動態改變

         自己的專案當中遇到了這樣一個問題,列表是動態載入的,而且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();
	}

這樣就可以了。