2014-05-23 1 views
8

J'ai ajouté un "pull to refresh" à ma listView, je voulais également ajouter une vue vide lorsque la liste est vide - Maintenant j'ai eu cette erreur. Comment puis-je faire ce travail? si je positionne une vue en dehors de swipeRefresh et que je l'ajoute en tant que emptyView, cela fonctionnera. Alors, comment je le fais avec un fichier XML externe ..?SwipeRefreshLayout ne peut héberger qu'un seul enfant direct

Le code xml:

 <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/swipeRefreshLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" > 


     <ListView 
      android:id="@android:id/list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:clipToPadding="false" 
      android:paddingBottom="@dimen/inbox_vertical_margin" ></ListView> 


</android.support.v4.widget.SwipeRefreshLayout> 

onCreateView:

View rootView = inflater.inflate(R.layout.fragment_inbox, container, 
     false); 

View empty = inflater.inflate(R.layout.empty_message_list, container, 
     false); 
ListView mListView = (ListView) rootView 
     .findViewById(android.R.id.list); 
((ViewGroup) mListView.getParent()).addView(empty); 
TextView textViewToChange = (TextView) empty 
     .findViewById(R.id.welcomeMessage); 

textViewToChange.setText("YO " 
     + ParseUser.getCurrentUser().getString(
       ParseConstants.KEY_PRESENTING_USERNAME) 
     + "! bad news.. :("); 
mListView.setEmptyView(empty); 

mSwipeRefreshLayout = (SwipeRefreshLayout) rootView 
     .findViewById(R.id.swipeRefreshLayout); 
mSwipeRefreshLayout.setOnRefreshListener(mOnRefreshListener); 
mSwipeRefreshLayout.setColorScheme(R.color.swipeRefresh1, 
     R.color.swipeRefresh2, R.color.swipeRefresh3, 
     R.color.swipeRefresh4); 

return rootView; 
+0

J'ai été confronté au même problème et j'ai trouvé que vous n'utilisiez qu'un seul listview qui est un enfant seulement et c'est très bien mais vous pourriez cacher sa visibilité, c'est ce que je faisais à ma fin –

Répondre

14

SwipeRefreshLayout devrait être le parent dans le fichier XML. Vous pouvez utiliser un FrameLayout comme enfant de SwipeRefreshLayout. Les ListView et TextView (ou toute autre vue d'état vide) peuvent être des vues enfants du FrameLayout.

+0

great Answer. .. – chhameed

+0

doit être accepté comme réponse – chhameed

+0

superbe travaillé comme une magie. Je vous remercie. – Irfan

0

J'avais besoin de mettre en œuvre la même fonctionnalité «tirer pour actualiser» dans mes applications. Une façon alternative (et assez simple) d'implémenter la 'vue vide' est d'utiliser les vues d'en-tête ou de bas de page de ListView.

D'abord, vous créez un fichier "empty_view.xml" contenant la disposition de la vue vide. Ensuite, dans la méthode onCreate() de votre activité d'hébergement, faire quelque chose comme:

View headerView = LayoutInflater.from(this).inflate(R.layout.empty_view, myListView, false); 
myListView.addHeaderView(headerView); 
myListView.setAdapter(adapter); 

// populate your ListView here 
// ...... 

// now check the number of items and remove the empty view if needed 
if (number_of_items > 1) { 
    myListView.removeHeaderView(headerView); 
} 
adapter.notifyDataSetChanged(); 

Dans le code ci-dessus MyListView est l'objet ListView et adaptateur est son adaptateur.

Ceci est également utile dans d'autres situations. Par exemple, supposons que les données de la liste sont lues à partir d'un service Web et sont lentes à charger, alors on peut mettre un ProgressBar en vue et le définir comme vue d'en-tête de ListView afin que l'utilisateur ait une indication visuelle.

Questions connexes