Actualiser Actuel Fragment (ListView de Données) en restant dans la même activité
L'appel d'une Fragment
à partir d'un Activity
, je suis l'affichage d'un ListView
avec deux Buttons
. Lorsque je clique sur un menu_item
(c'est à dire en Ligne), je mets à jour les données et donc la ListView
. Maintenant, j'ai besoin afin de refléter la mise à jour des données. Comment puis-je actualiser la Fragment
après je clique sur Afficher en Ligne. Jusqu'à présent, j'ai utilisé le code suivant:
Intent intent = getIntent();
Intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
Mais cela va redémarrer tout Activity
. J'ai juste besoin de rafraîchir la Fragment
.
Modifié : Code Ajouté
CLASSE D'ACTIVITÉ
public class ContactListActivity extends ActionBarActivity {
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar actionBar = getActionBar();
MenuButtonUtil.enableMenuButton(this);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MyContactsFragment contactListFragment = new MyContactsFragment ();
fragmentTransaction.replace(android.R.id.content, contactListFragment);
fragmentTransaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.show_online) {
ContentValues values = new ContentValues();
String where = "((" + ContactsContentProvider.PHONE_ID + " NOTNULL) AND ((" +
ContactsContentProvider.PHONE_ID+ " = 17486 )OR (" +
ContactsContentProvider.PHONE_ID+ " = 17494 )))";
values.put(ContactsContentProvider.STATUS, true);
this.getContentResolver().update(ContactsContentProvider.CONTENT_URI, values, where, null);
listView = (ListView) this.findViewById(android.R.id.list);
((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();
return true;
}
return super.onOptionsItemSelected(item);
}
}
Fragment
public class MyContactsFragment extends ListFragment{
Button allContactsBtn;
Button neeoContactsBtn;
ListView listView;
CustomAdapterForAllContacts adapterForAllContacts;
CustomAdapterForNeeoContacts adapterForNeeoContacts;
@Override
public void onCreate(Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onCreate(savedInstanceState);
final ActionBar actionBar = getActivity().getActionBar();
MenuButtonUtil.enableMenuButton(getActivity());
adapterForNeeoContacts = new CustomAdapterForNeeoContacts();
adapterForAllContacts = new CustomAdapterForAllContacts();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.contactsfragment, container,false);
allContactsBtn = (Button) view.findViewById(R.id.allContactsButton);
neeoContactsBtn = (Button) view.findViewById(R.id.neeoContactsButton);
listView = (ListView) view.findViewById(android.R.id.list);
//==================== Neeo Contacts ============================
neeoContactsBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listView.setAdapter(adapterForNeeoContacts);
}
});
//====================== All Contacts =============================
allContactsBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listView.setAdapter(adapterForAllContacts);
}
});
return view;
}
Adaptateur:
private class CustomAdapterForAllContacts extends BaseAdapter {
public CustomAdapterForAllContacts(){
}
List<Contact> contactsList = getAllContacts();
@Override
public int getCount() {
//TODO Auto-generated method stub
return contactsList.size();
}
@Override
public Contact getItem(int arg0) {
//TODO Auto-generated method stub
return contactsList.get(arg0);
}
@Override
public long getItemId(int arg0) {
//TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
if(view==null)
{
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_item, viewGroup,false);
}
TextView contName = (TextView)view.findViewById(R.id.nameText);
TextView contNumber = (TextView)view.findViewById(R.id.numberText);
ImageView image = (ImageView)view.findViewById(R.id.contact_image);
Contact contact = contactsList.get(position);
String status = contact.getStatus();
if(contact.getStatus().equals("1")){
image.setBackgroundResource(com.example.mycontentprovider.R.drawable.person_empty_online);
}else{
image.setBackgroundResource(com.example.mycontentprovider.R.drawable.person_empty_offline);
}
contName.setText(contact.getName());
contNumber.setText(contact.getPhoneNumber());
return view;
}
public Contact getContactPosition(int position)
{
return contactsList.get(position);
}
public List<Contact> getAllContacts(){
List<Contact> contactList = new ArrayList<Contact>();
String URL = "content://com.example.provider.Contacts/contacts";
Uri baseUri1 = Uri.parse(URL);
String[] select = {ContactsContentProvider.PHONE_ID, ContactsContentProvider.STATUS};
String where = "((" + ContactsContentProvider.NEEO_USER + " NOTNULL) AND (" +
ContactsContentProvider.NEEO_USER+ " = 1 )AND (" +
ContactsContentProvider.STATUS+ " = 1 ))";
Cursor cursor = getActivity().getContentResolver().query(baseUri1, select, where, null, "pid");
for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {
Log.w("Filtered IDS",""+ cursor.getString(cursor.getColumnIndex(ContactsContentProvider.PHONE_ID))+
""+ cursor.getString(cursor.getColumnIndex(ContactsContentProvider.STATUS)));
}
Uri baseUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER};
String selection = "((" +
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " NOTNULL) AND (" +
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " != ' ' ))";
String[] selectionArgs = null;
String sortOrder = ContactsContract.CommonDataKinds.Phone._ID + " COLLATE LOCALIZED ASC";
Cursor mCursor= getActivity().getContentResolver().query(baseUri, projection, selection, selectionArgs, sortOrder);
//Joinging Both Cursors
CursorJoiner joiner = new CursorJoiner(cursor, new String[] {ContactsContentProvider.PHONE_ID} , mCursor, new String[] {ContactsContract.CommonDataKinds.Phone._ID});
for (CursorJoiner.Result joinerResult : joiner) {
Contact cont = new Contact();
Log.e("Result", joinerResult.toString());
switch (joinerResult) {
case LEFT:
//handle case where a row in cursorA is unique
break;
case RIGHT:
//handle case where a row in cursorB is unique
cont.setID(mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)));
cont.setName(mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
cont.setPhoneNumber(mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
cont.setStatus("0");
contactList.add(cont);
break;
case BOTH:
//handle case where a row with the same key is in both cursors
cont.setID(mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)));
cont.setName(mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
cont.setPhoneNumber(mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
cont.setStatus(cursor.getString(cursor.getColumnIndex(ContactsContentProvider.STATUS)));
contactList.add(cont);
break;
}
}
mCursor.close();
cursor.close();
return contactList;
}
}
Utilisé
Alors Quoi? Quelque chose en particulier au sujet de ListFragment concernant l'actualisation de l'Fragment.
et sur cette carte
Pouvez-vous me montrer le code avec lequel vous créez la
Essayez d'utiliser le Glisser à l'Actualisation De Votre Application. Voir ce stackoverflow.com/questions/41469040/fragment-refresh/...
ListFragment
pour que ...Alors Quoi? Quelque chose en particulier au sujet de ListFragment concernant l'actualisation de l'Fragment.
et sur cette carte
.notifyDataSetChanged()
sur l'Activité Resume()
ou n'importe où...ça va mettre à jour votre ListFragment
...Pouvez-vous me montrer le code avec lequel vous créez la
Adapter
? Et voir ma réponse pour une éventuelle explication pourquoi notifyDataSetChanged()
ne fonctionne pas dans votre cas. Pour résumer: vous avez besoin de changer la source de données de la Adapter
, après que l'appel notifyDataSetChanged()
actualiser la ListView
.Essayez d'utiliser le Glisser à l'Actualisation De Votre Application. Voir ce stackoverflow.com/questions/41469040/fragment-refresh/...
OriginalL'auteur BST Kaal | 2014-07-09
Vous devez vous connecter pour publier un commentaire.
Vous avez plusieurs options pour résoudre cette fonction sur comment exactement vous avez mis en place votre
ListView
etAdapter
.notifyDataSetChanged()
Adapter
Mise à jour avec notifyDataSetChanged()
C'est la meilleure solution, mais vous avez besoin de modifier la
List
laAdapter
est à l'aide pour que cela fonctionne. Par exemple, si vous utilisez unArrayAdapter
comme ceci:Comme vous pouvez le voir le
String[]
est la source de données pour notreAdapter
. Nous pouvons modifier le tableau comme ça, mais ces changements ne seront pas immédiatement reflété dans leListView
:Seulement une fois que nous appelons
notifyDataSetChanged()
sera leListView
être mis à jour:De la documentation:
Mais NE PAS confondre
notifyDataSetChanged()
avecnotifyDataSetInvalidated()
, parce quenotifyDataSetInvalidated()
fait quelque chose de complètement différent et qu'il suffit de gâcher votreListView
.De la documentation:
Mise à jour par la réinitialisation de la
Adapter
C'est assez simple. Chaque fois que vous réglez un nouveau
Adapter
laListView
va se mettre à jour. Si vous ne pouvez pas utilisernotifyDataSetChanged()
pour une raison quelconque, alors vous devez le faire comme cela. Il suffit de créer un nouveauAdapter
chaque fois que vous souhaitez mettre à jour votreListView
:Et l'utilisation
setAdapter()
de le mettre à laListView
:Ce sera toujours mise à jour le
ListView
mais il ya quelques problèmes avec cette solution. D'abord et avant tout à chaque fois que vous mettez à jour leListView
de cette manière, il serait de revenir en arrière et vers le haut qui peut être assez gênant quand il y a des mises à jour fréquentes ou quand il y a beaucoup de contenu dans leListView
.EDIT:
Il y a quelques choses dans votre code qui ne sont pas tout à fait optimale. D'abord et avant tout, votre
Adapter
ne devrait pas contenir un code pour télécharger les contacts. Il ne leur appartient pas, la seule responsabilité d'uneAdapter
devrait être qu'il créeViews
à partir d'une source de données particulière. Alors d'abord, vous devez déplacer legetAllContacts()
méthode en dehors de laAdapter
. Je vous suggère de créer statique méthode d'aide pour cela, j'ai pris la liberté de modifier votre code en conséquence:Avec ce code, vous pouvez obtenir tous les contacts comme ceci:
Après cela, nous avons besoin de modifier votre
Adapter
de sorte quenotifyDateSetChanged()
:J'ai changé plusieurs choses dans ce
Adapter
. D'abord et avant tout laList
deContacts
est maintenant final et j'ai ajouté une méthodecontacts()
pour exposer laList
afin que nous puissions modifier les données dans laAdapter
de l'extérieur. J'ai aussi mis en œuvre le point de vue du titulaire motif de la sorte, votreListView
permet un défilement plus rapide et plus fluide!J'espère que je n'ai rien oublié, mais ce devrait être tous les changements dont vous avez besoin. Vous pouvez utiliser la nouvelle
Adapter
comme ceci:Si vous souhaitez mettre à jour la
ListView
plus tard, vous devez modifier leList
à l'intérieur de laAdapter
comme ceci:J'espère que je pourrais vous aider et si vous avez d'autres questions, n'hésitez pas à demander!
J'ai inclus le code. Vérifier maintenant.
Ok, je vois. Vous ne devriez pas effectuer le téléchargement de données à l'intérieur de l'adaptateur. Quelque chose comme ça qui ne leur appartient pas. Le
List
utilisée comme source de données à l'intérieur de laAdapter
devrait normalement être définitives et ne sont pas traitées comme vous le faites. Je vais modifier ma réponse avec quelques suggestions.Thnx , heureux d'attendre.
J'ai mis à jour ma réponse! Si vous avez d'autres questions, n'hésitez pas à demander.
OriginalL'auteur Xaver Kapeller
Si vous êtes à l'intérieur d'un Fragment, alors vous pouvez faire
OriginalL'auteur Kaustubh