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();
助けてください。