Pb de m à j ListFragment depuis DialogFragment
Bonjour à tous,
Je suis débutant en développement Android, je vous sollicite car j'écris une application simple (liste de courses), pour faire un peu le tour des possibilités sur android.
Je bloque, je voudrais bien que le ListFragment qui affiche mes courses, se mette à jour après la saisie dans le dialogFragment.
Les saisies se stockent bien en Base de données mais le rafraîchissement de la liste ne se fait pas.
J'ai lu pas mal de doc et d'exemples sur le net mais sans résultat.
Voici le code de MainActivity.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
package fr.jldm.androliste;
import java.util.ArrayList;
import java.util.List;
import fr.jldm.androliste.apropos.AproposFragment;
import fr.jldm.androliste.historique.HistoriqueFragment;
import fr.jldm.androliste.maliste.Maliste;
import fr.jldm.androliste.maliste.MalisteAdapter;
import fr.jldm.androliste.maliste.MalisteFragment;
import fr.jldm.androliste.maliste.MalisteDialogFragment;
import fr.jldm.androliste.maliste.MalisteRepository;
import fr.jldm.androliste.panier.PanierFragment;
import fr.jldm.androliste.parametres.ParametresFragment;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends Activity implements
NavigationDrawerFragment.NavigationDrawerCallbacks,
MalisteDialogFragment.MalisteDialogItemAddedListener
{
private NavigationDrawerFragment mNavigationDrawerFragment;
private CharSequence mTitle;
private ArrayAdapter<String> mArrayAdapterHistorique;
private ArrayList<String> mItemHistorique;
private ArrayAdapter<String> mArrayAdapterPanier;
private ArrayList<String> mItemPanier;
private List<Maliste> mItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
FragmentManager mFragmentManager = getFragmentManager();
switch (position) {
case 0:
mFragmentManager.beginTransaction()
.replace(R.id.container, PanierFragment.newInstance(position+1), Integer.toString(position))
.commit();
break;
case 1:
mFragmentManager.beginTransaction()
.replace(R.id.container, MalisteFragment.newInstance(position+1), Integer.toString(position))
.commit();
break;
case 2:
mFragmentManager.beginTransaction()
.replace(R.id.container, HistoriqueFragment.newInstance(position+1), Integer.toString(position))
.commit();
break;
default:
break;
}
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
case R.id.menu_global_about:
mTitle = getString(R.string.action_about);
break;
case R.id.menu_global_settings:
mTitle = getString(R.string.action_settings);
break;
case R.id.maliste_menu_add:
mTitle = getString(R.string.title_maliste_form);
}
}
public void restoreActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(R.string.app_name);
actionBar.setSubtitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
FragmentManager mFragmentManager = getFragmentManager();
int itemId = item.getItemId();
switch (itemId) {
case R.id.menu_global_settings:
mFragmentManager.beginTransaction()
.replace(R.id.container, ParametresFragment.newInstance(R.id.menu_global_settings))
.commit();
return true;
case R.id.menu_global_about:
mFragmentManager.beginTransaction()
.replace(R.id.container, AproposFragment.newInstance(R.id.menu_global_about))
.commit();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void malisteDialogItemAdded(Maliste newItem) {
MalisteFragment mMalisteFragment = (MalisteFragment)getFragmentManager().findFragmentByTag("1");
mItems.add(newItem);
mMalisteFragment.getAdapter().notifyDataSetChanged();
mMalisteFragment.refresh();
}
} |
celui de MalisteFragment.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
package fr.jldm.androliste.maliste;
import android.app.Activity;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import fr.jldm.androliste.MainActivity;
import fr.jldm.androliste.R;
public class MalisteFragment extends ListFragment
{
private static final String ARG_SECTION_NUMBER = "section_number";
private MalisteAdapter mMalisteAdapter;
private MalisteRepository mMalisteRepository;
public static MalisteFragment newInstance(int sectionNumber){
MalisteFragment fragment = new MalisteFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public MalisteFragment(){}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mMalisteRepository = new MalisteRepository(getActivity());
mMalisteRepository.Open();
mMalisteAdapter = new MalisteAdapter(getActivity(), mMalisteRepository.GetAll());
mMalisteRepository.Close();
setListAdapter(mMalisteAdapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_maliste, container, false);
return mView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onResume() {
super.onResume();
mMalisteAdapter.notifyDataSetChanged();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.maliste, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int mIdItem = item.getItemId();
switch (mIdItem) {
case R.id.maliste_menu_synchro:
return true;
case R.id.maliste_menu_add:
showFormulaire();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void showFormulaire(){
FragmentTransaction mFragmentTransaction = getFragmentManager().beginTransaction();
Fragment mFragment = getFragmentManager().findFragmentByTag(getResources().getString(R.string.tag_maliste_dialog));
if(mFragment != null){
mFragmentTransaction.remove(mFragment);
}
mFragmentTransaction.addToBackStack(null);
DialogFragment mMalisteForm = null;
mMalisteForm = MalisteDialogFragment.newInstance(R.string.tag_maliste_dialog, getResources().getString(R.string.title_maliste_form));
int tag = R.string.tag_maliste_dialog;
mMalisteForm.show(getFragmentManager(), Integer.toString(tag));
}
public void refresh(){
mMalisteRepository.Open();
mMalisteAdapter = new MalisteAdapter(getActivity(), mMalisteRepository.GetAll());
mMalisteRepository.Close();
mMalisteAdapter.notifyDataSetChanged();
setListAdapter(mMalisteAdapter);
}
public MalisteAdapter getAdapter(){
return mMalisteAdapter;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(getArguments().getInt(ARG_SECTION_NUMBER));
}
} |
celui de DialogFragment.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
package fr.jldm.androliste.maliste;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import fr.jldm.androliste.MainActivity;
import fr.jldm.androliste.R;
import fr.jldm.androliste.parametres.ParametresFragment;
import android.app.Activity;
import android.app.DialogFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
public class MalisteDialogFragment extends DialogFragment
{
private EditText mEditTextCode;
private EditText mEditTextQuantite;
private EditText mEditTextPrix;
private EditText mEditTextLibelle;
private EditText mEditTextDescription;
private String mAujourdhui;
//private static final String TAG_ACTION_ADD = "add";
//private static final String TAG_ACTION_UPDATE = "update";
private MalisteRepository mMalisteRepository;
private Maliste mMaliste;
private static final String ARG_SECTION_NUMBER = "section_number";
private static final String ARG_TITRE = "titre";
private MalisteDialogItemAddedListener mMalisteDialogItemAddedListener;
public static MalisteDialogFragment newInstance(int sectionNumber, String titre){
MalisteDialogFragment fragment = new MalisteDialogFragment();
Bundle args = new Bundle();
if(titre != null) args.putString(ARG_TITRE, titre);
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public MalisteDialogFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_maliste_form, container, false);
String titre = getArguments().getString(ARG_TITRE);
getDialog().setTitle(titre);
return mView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mAujourdhui = df.format(c.getTime());
mMalisteRepository = new MalisteRepository(getActivity().getApplicationContext());
mEditTextCode = (EditText)view.findViewById(R.id.form_maliste_code);
mEditTextQuantite = (EditText)view.findViewById(R.id.form_maliste_quantite);
mEditTextPrix = (EditText)view.findViewById(R.id.form_maliste_prix);
mEditTextLibelle = (EditText)view.findViewById(R.id.form_maliste_libelle);
mEditTextDescription = (EditText)view.findViewById(R.id.form_maliste_description);
Button mButtonValidate;
mButtonValidate = (Button)view.findViewById(R.id.form_maliste_btn_validate);
mButtonValidate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
float mQuantite = 1;
float mPrix = 0;
int mId = ParametresFragment.mPrefId;
//int mParent = ParametresFragment.mPrefParent;
if(mEditTextQuantite.getText().toString().length()>0){
mQuantite = Float.parseFloat(mEditTextQuantite.getText().toString());
}
if(mEditTextPrix.getText().toString().length()>0){
mPrix = Float.parseFloat(mEditTextPrix.getText().toString());
}
String mCode = null;
String mLibelle = null;
String mDescription = null;
if(mEditTextCode.getText().toString() != null) mCode = mEditTextCode.getText().toString();
if(mEditTextLibelle.getText().toString() != null) mLibelle = mEditTextLibelle.getText().toString();
if(mEditTextDescription.getText().toString() != null) mDescription = mEditTextDescription.getText().toString();
if(mCode.length()>0 && mLibelle.length()>0){
mMaliste = new Maliste(mCode, mQuantite, mLibelle, mDescription, mPrix, mAujourdhui, 1, mId);
ajouterMaliste();
mMalisteDialogItemAddedListener.malisteDialogItemAdded(mMaliste);
}
dismiss();
}
});
Button mButtonCancel;
mButtonCancel = (Button)view.findViewById(R.id.form_maliste_btn_cancel);
mButtonCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
private void ajouterMaliste(){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
mMalisteRepository.Open();
mMalisteRepository.Save(mMaliste);
mMalisteRepository.Close();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public interface MalisteDialogItemAddedListener{
public void malisteDialogItemAdded(Maliste newItem);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(getArguments().getInt(ARG_SECTION_NUMBER));
try {
mMalisteDialogItemAddedListener = (MalisteDialogItemAddedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()+" doit implémenter MalisteDialogItemAddedListener");
}
}
} |
J'ai bien capter que tout doit passer par MainActivity pour que les fragments discutent entre eux.
Est ce que quelqu'un pourrai m'indiquer la marche à suivre pour que ça fonctionne?
Merci
Finalement j'ai trouvé la solution
J'ai fait cette modification dans le code de MainActivity.java
maintenant ça fonctionne correctement.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
@Override
public void malisteDialogItemAdded(Maliste newItem) {
MalisteFragment mMalisteFragment = (MalisteFragment)getFragmentManager().findFragmentByTag("1");
MalisteRepository mMalisteRepository = new MalisteRepository(getApplicationContext());
mMalisteRepository.Open();
List<Maliste> mItems = mMalisteRepository.GetAll();
mMalisteRepository.Close();
mItems.add(newItem);
MalisteAdapter mMalisteAdapter = new MalisteAdapter(getApplicationContext(), mItems);
mMalisteFragment.setListAdapter(mMalisteAdapter);
mMalisteFragment.getAdapter().notifyDataSetChanged();
} |