1

3とメニューを作成するFragmentActivity(メイン)がありFragmentsます。非常に単純明快で、Android SDK の例からもわかります。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dbh = new DBHelper(this);

    // Create the adapter that will return a fragment for each of the
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
}

// code //


@Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch(position){
            case 0:
                fragment = new DaySectionFragment(Main.this, dbh);
                break;
            case 1:
                fragment = new WeekSectionFragment(Main.this, dbh);
                break;
            case 2:
                fragment = new FoodListSectionFragment(Main.this, dbh);
                break;
            case 3:
                fragment = new AboutSectionFragment();
                break;
        }

        return fragment;
    }
//more code

メイン アクティビティのメニューから、editText を含むダイアログが表示されます。このテキストフィールドからの値はデータベースに保存されていると想定されていますが、これは正常に機能し、フラグメントのリストビューにもポップアップします (ListFragment ではなく、リストビューを含むフラグメント)。簡単な方法は、ListView アダプターで notifyDataSetChanged() を呼び出すことです。しかし、私はそれを行うことはできません。

これは、ListView のフラグメントです。

public class FoodListSectionFragment extends Fragment {
private Context context;
private DBHelper dbh;
private ArrayList<FoodData> listItems = new ArrayList<FoodData>();
private FoodAdapter adapterFoodList;
private AdapterView.AdapterContextMenuInfo adapterInfo;
private ListView lvItems;

public FoodListSectionFragment() {
}
public FoodListSectionFragment(Context context, DBHelper dbh) {
    this.context = context;
    this.dbh = dbh;
    //setTag("FoodListFragment");
}
public void updateList(){
    adapterFoodList.notifyDataSetChanged();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View myView = getLayoutInflater(null).inflate(R.layout.food_list, null);

    listItems.clear();
    listItems = (ArrayList<FoodData>) dbh.selectAllFood();

    adapterFoodList = new FoodAdapter(context, R.layout.list_row_food, listItems);

    lvItems = (ListView)myView.findViewById(R.id.listFood);
    lvItems.setAdapter(adapterFoodList);
    adapterFoodList.notifyDataSetChanged();

    return myView;
}
}

ここでは、ListView を更新しようとしていますが、これは機能しません。

dialogAddFood = new Dialog(Main.this);
            dialogAddFood.setContentView(R.layout.dialog_add_food);
            dialogAddFood.setTitle(R.string.menu_add_food);
            dialogAddFood.setCancelable(true);

            Button btnSave = (Button) dialogAddFood.findViewById(R.id.btnSave);
            btnSave.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    EditText edtFood = (EditText)dialogAddFood.findViewById(R.id.edtFood);
                    RatingBar ratingGrade = (RatingBar)dialogAddFood.findViewById(R.id.ratingGrade);
                    RatingBar ratingDiff = (RatingBar)dialogAddFood.findViewById(R.id.ratingDiff);

                    if(edtFood.getText().toString().length() > 0){
                        dbh.insertFood(edtFood.getText().toString(), (int)ratingGrade.getRating(), (int)ratingDiff.getRating());
                        Toast.makeText(Main.this, "Maträtt tillagd", Toast.LENGTH_LONG).show();

                        //FoodListSectionFragment f = (FoodListSectionFragment)Main.this.getSupportFragmentManager().findFragmentByTag("FoodList");
                        //f.updateList();

                        ListView l = (ListView)mSectionsPagerAdapter.getItem(2).getView().findViewById(R.id.listFood);
                        FoodAdapter a = (FoodAdapter)l.getAdapter();
                        a.notifyDataSetChanged();

                    }

                    dialogAddFood.cancel();
                }
            });
            Button btnCancel = (Button) dialogAddFood.findViewById(R.id.btnCancel);
            btnCancel.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialogAddFood.cancel();
                }
            });
            dialogAddFood.show();

助けてください。

4

1 に答える 1

2

次の行のため、コードは機能しません。

mSectionsPagerAdapter.getItem(2)

Fragmentから位置 2の を返さず、その位置に新しいを作成し、ViewPagerこのインスタンスFragmentupdate メソッドを呼び出しても、これはあなたにアタッチされていない (目に見えるものではない) ため、明らかに変更は行われません。FragmentFragmentActivity

Fragment以下のようなものを使用してそれを探し、FragmentManagerそれがどのようになるかを確認してください。

// ...
Toast.makeText(Main.this, "Maträtt tillagd", Toast.LENGTH_LONG).show();

//FoodListSectionFragment f = (FoodListSectionFragment)Main.this.getSupportFragmentManager().findFragmentByTag("FoodList");
//f.updateList();
FoodListSectionFragment fr = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.theIdOfTheViewPager + ":2");
if (fr != null && fr.getView() != null) {
    fr.updateList();
}
于 2012-12-05T18:31:32.977 に答える