1

ListFragmentあなたの友達の「グループ」を持つアクティビティがあります。グループは sqlite データベースに保存されます。

グループをクリックすると、別のアクティビティ ページが表示されます。このページには、その特定のグループの参加者が表示されます。

参加者ページには、「グループを削除して削除する」オプションがあるアクション バー メニューがあります。これにより、「グループ」ページに戻ります。これは、脱退したばかりのグループのメンバーではなくなったためです。

私の問題は、[参加者] ページで削除オプションをコーディングすると、[グループ] ページにアダプターへの参照がないことです。notifyDataSetChangedそのため、グループ ページにアクセスできません。したがって、[グループ] ページに戻ると、グループの 1 つを削除しただけで、リストは同じです。(それか、私のsqlite削除クエリが機能していない可能性があります)

また、notifyDataSetChangedメニューオプションで使用することになっているかどうかもわかりません。onCreateまたはおそらく他のライフサイクルメソッドで何かを呼び出す方が理にかなっていますか?

どんな助けでも大歓迎です。ありがとう!

擬似コード:

GroupListFragment

public class GroupListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {

    // custom CursorLoader which is based on the SimpleCursorLoader found at the below link
    // http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider
    // Basically, the CursorLoader was subclassed to replace references of the content provider
    // with the sqlite database


    public static final class CustomCursorLoader extends SimpleCursorLoader{

           //relevent thing here is that my custom cursor loader queries my database
           // in the loadInBackground() method, returning a cursor.

    }



// Standard onCreate, onActivityCreated and onLoadFinished methods
// onCreateLoader is the only somewhat different method in that it uses my custom 
// cursorloader class

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1,null,FROM,TO,0 );
    setListAdapter(mAdapter);
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    setListAdapter(mAdapter);
    getLoaderManager().initLoader(0,null,this);
}

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    return new CustomCursorLoader(getActivity(),getHelper());
}

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    mAdapter.swapCursor(cursor);
}

参加者活動ページ

//relevant section is menu

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()){
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        case R.id.deleteGroupMenuSelection:

            //my db helper class
            ContractDBHelpers mHelper = new ContractDBHelpers(getApplicationContext());
            SQLiteDatabase db = mHelper.getWritableDatabase();
            db.delete(GroupContract.GroupDetails.TABLE_NAME, GroupContract.GroupDetails._ID+"=?",new String[] {Integer.toString(position)});
            db.close();
            /***********************************************************************
            * here is where I think I'm supposed to notifyDataSetChanged
            * but since I'm in an Activity, I don't know how to reference the adapter
            ************************************************************************/

            Intent intent = new Intent(this,MainActivity.class);
            startActivity(intent);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
4

1 に答える 1

0

あるアクティビティから前のアクティビティへの通信には、startActivityForResult()、setResult()、および onActivityResult() を使用する主要な手段を使用することをお勧めします。何かが欠けていない限り、あなたのユースケースがこのメカニズムを活用したいと思うのは、私にはかなり適切だと思われます。

なんらかの理由で、最上位のアクティビティ (参加者) を維持したまま、前のアクティビティを通知したい場合は、代わりに LocalBroadcastReceiver を使用できます。

于 2013-12-30T01:31:25.047 に答える