1

保存と編集の目的で同じアクティビティを使用します。リストビューがあります。

私が持っているリストフラグメントでは

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        if(dbHelper != null){
            Item item = (Item) this.getListAdapter().getItem(position);
            Intent intent = new Intent(getActivity(), SaveEditActivity.class);
            intent.putExtra("Update_Item", item);
            startActivity(intent);
        }
    }

今私が持っているSaveEditActivityに

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(....);
        Intent intent = getIntent();
        if(intent.hasExtra("Update_Item")){
            Item item = (Item) intent.getSerializableExtra("Update_Item");
            if(item != null){
                this.isEdit = true;
                this.editedItem = item;
                setItemData(item); // set the data in activity
            }
        }
}

ユーザーが保存ボタンをクリックすると、 isEdit フラグを確認します

 if(isEdit == true){
        updateItem();//update
     }else{
      saveItem(); // add
     }
 }

Update メソッドでは、editedItemオブジェクトを使用してデータベース内の項目を更新します

private void updateItem(){
      if(this.editedItem != null){
          dbHelper.updateItem(editedItem);
      }
    }

しかし、リスト ビューが新しいデータで更新されません。

customAdapterwhich extendsを使用していますBaseAdapter

ListFragmet では、データを onResume() メソッドでアダプターにロードします

@Override
    public void onResume() {
        super.onResume();
        dbHelper = new DatabaseHandler(getActivity());
        List<Item> existingItems = dbHelper.getItemData();
        adapter = new CustomAdapter(getActivity().getApplicationContext(), existingItems);
        if(adapter != null){
           this.setListAdapter(adapter);
           adapter.notifyDataSetChanged();
        }
    }

アクティビティから戻るときに、このメソッドを呼び出して、アダプターに変更を通知する必要がありますか? そうじゃない?

誰でも助けてもらえますか?

4

1 に答える 1

1

どういうわけかListView、データセットが自動的に更新されるように変更/更新されたことを通知する必要があります。私のアプリの1つで、ObserverインターフェースとObservableクラスを使用して、データが変更されたかどうかを観察しました。これは私が事件を解決するのに役立ちます。

使用できるアイデアは、変更されたデータセットを更新/保存するたびにあるため、変更した後は、次の名前のメソッドを呼び出す必要があります。notifyDataSetChanged()

/* don't be confuse with this method's name, Its a custom method. I
   used this name. You may use another like myAbcdMethod() :) */
private void notifyDataSetChanged() {
    setChanged();
    notifyObservers(new Boolean(true));
}

notifyDataSetChanged()はプライベートメソッドであり、これをDbHelperに実装する必要があります。edit.saveごとに、これを呼び出すことができます。

また、アクティビティでは、以下を使用してリストを更新する必要があります。

    @Override
    public void update(Observable observable, Object data) {
        isDataChanged = (Boolean) data;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        if (isDataChanged) {
            adapter.clear();
            adapter.refresh(screenNames.toArrayList());
            adapter.notifyDataSetChanged();
            isDataChanged = false;
        }
    }

これは、単一のアクティビティアプリから複数のアクティビティアプリで機能します。

于 2013-01-20T07:13:25.317 に答える