BaseAdapter notifyDatasetChanged () appelé mais getView () n'est jamais appelé
J'ai une coutume adaptateur permettant de visualiser chaque ligne de la liste des Commandes.
public class OrderRowAdapter extends BaseAdapter implements OnClickListener {
OrderList items_;
LayoutInflater inflater_;
int list_view_resource_id_;
private final String TAG = "OrderRowAdapter";
public OrderRowAdapter(Context context, int list_view_resource_id,
OrderList items) {
this.list_view_resource_id_ = list_view_resource_id;
this.items_ = items;
this.inflater_ = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public Object getItem(int position) {
return items_.getOrders(position);
}
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "View updated for item in position = " + position);
View v = convertView;
if (v == null) {
v = inflater_.inflate(list_view_resource_id_, parent);
}
Order item = items_.getOrders(position);
if (item != null) {
TextView order_info_tv = (TextView) v.findViewById(R.id.order_info);
TextView order_status_tv = (TextView) v.findViewById(R.id.order_status);
if (order_info_tv != null) {
order_info_tv.setText(
String.format("For customer: %s\nTotal of %d items", item.getCustomerId(), item.getItemsCount()));
}
if (order_status_tv != null) {
order_status_tv.setText("Status: " + getStatusText(item.getStatus()));
}
}
return v;
}
public int getCount() {
if (items_ == null) {
Log.d(TAG, "Null so get count returned 0");
return 0;
} else {
Log.d(TAG, "Get count returned " + items_.getOrdersCount());
return items_.getOrdersCount();
}
};
Après interrogation nouvelle liste de commandes à partir d'un service web, je veux mettre à jour le contenu de la liste, j'ai donc mon Activité n'est la mise à jour avant d'appeler notifyDataSetChanged()
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orders);
initThreading();
findViews();
setUrls();
//Load the list of order from disk
try {
order_list_ = OrderList.parseFrom(new FileInputStream(
"/sdcard/orderList.bin"));
} catch (FileNotFoundException e) {
Log.e(TAG, "Cannot find the file", e);
} catch (IOException e) {
Log.e(TAG, "Cannot read the file", e);
}
order_row_adapter_ = new OrderRowAdapter(OrderActivity.this,
R.layout.order_row, order_list_);
orders_listview_.setAdapter(order_row_adapter_);
//Request new updates from the server
updateOrderInformation(-1);
}
public void updateOrders(InputStream new_order_stream) {
Log.d(TAG, "Updating order UI");
try {
order_list_.parseFrom(new_order_stream);
} catch (IOException e) {
Log.e(TAG, "IOException" , e);
}
runOnUiThread(new Runnable() {
public void run() {
guiUpdateOrders();
}
});
}
private void guiUpdateOrders() {
order_row_adapter_.notifyDataSetChanged();
Log.d(TAG, "Dataset notified that it has changed. GUI update anytime now.");
}
Mais, le getView() la méthode de OrderRowAdapter n'est jamais appelée. La liste n'est jamais mis à jour.
source d'informationauteur Dat Chu
Vous devez vous connecter pour publier un commentaire.
Il s'avère que le problème avec mon
getView()
pas appelé c'est parce qu'il n'est pas visible. Ma mise en page xml a la partie supérieureTextView
avecfill_parent
pour sa hauteur. Ainsi, la totalité de la vue a uniqueTextView
visible.Solution: vérifier la vue graphique de la mise en page en question pour vous assurer que le
ListView
est visible.Assurez-vous que
BaseAdapter
méthodesne sont pas remplacées.
De modifier le contenu de votre Liste, vous devez continuer à utiliser la même référence à la Liste. Ici, vous êtes en train de créer une autre liste et en l'assignant à la
items_
variable (qui ne contient pas la liste elle-même, c'est juste un endroit pour stocker une référence à une Liste), mais votre point de Vue a toujours une référence à l'ancienne liste.Au lieu de
items_ = new_order_list
cela devrait fonctionner :EDIT :
D'expliquer mieux, essayez de créer une nouvelle variable nommée
old_items
:Si toutes les réponses ci-dessus ne fonctionne pas, essaie avec invalidateViews()
ListView.invalidateViews() est-à-dire l'ListView à la nullité de tous ses enfants de l'élément de vues (redessiner).
Noter qu'il n'y a pas besoin d'être un nombre égal de points de vue que d'éléments. C'est parce que d'une ListView recycle ses point de vues et se déplace autour de l'écran de manière intelligente pendant que vous faites défiler.
Mon exemple de mise en œuvre,
Si aucune erreur dans cette réponse, merci de corriger mes erreurs.