首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android DialogFragment 編輯 ListView 數據異步更新機制解析

     編輯:程式設計綜合問答

問題現象

點擊 ListView 項目彈出 DialogFragment 編輯數據,確認後數據已保存,但 ListView 未即時刷新;再次點擊同一項目時才顯示更新後的值。

根本原因:異步執行流程


// 錯誤代碼片段
LoginDialogFragment dialog = new LoginDialogFragment();
dialog.show(getFragmentManager(), "loginDialog");  // 非阻塞,立即返回

pp.setHeight(height);        // 此時 height 仍是舊值!
mAdapter.notifyDataSetChanged();  // 刷新了舊數據

dialog.show() 是異步非阻塞的:它只負責排程顯示對話框,隨後代碼立即繼續執行,而非等待用戶操作完成。

正確模式:回調機制

1. 定義接口(已有)


public interface LoginInputListener {
    void onLoginInputComplete(String username);
}

2. Dialog 確認時回調


.setPositiveButton("Sign in", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int id) {
        LoginInputListener listener = (LoginInputListener) getActivity();
        listener.onLoginInputComplete(mUsername.getText().toString());
    }
})

3. Activity 實現接口並在回調中刷新


public class MainActivity extends Activity implements LoginInputListener {
    // ...

    @Override
    public void onLoginInputComplete(String username) {
        // 此處執行於用戶點擊「確定」後
        Person pp = (Person) mAdapter.getItem(selectedPosition);  // 需記錄 position
        pp.setHeight(username);
        mAdapter.notifyDataSetChanged();  // 刷新最新數據
    }
}

4. 傳遞 position 給 Dialog


// 方案一:通過 Bundle
Bundle args = new Bundle();
args.putInt("position", position);
dialog.setArguments(args);

// 方案二:構造方法/Setter
dialog.setTargetPosition(position);

關鍵點總結

錯誤做法正確做法
show() 後立即刷新在 onLoginInputComplete 回調中刷新
使用全局變量 height直接在回調參數中獲取新值
未記錄編輯項目 position通過 Bundle/Setter 傳遞 position

進階:使用 setTargetFragment

更規範的 Fragment 通信方式:


// 調用方
dialog.setTargetFragment(this, REQUEST_CODE);
dialog.show(getFragmentManager(), "tag");

// Dialog 內部
getTargetFragment().onActivityResult(REQUEST_CODE, RESULT_OK, data);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved