ListView ne rend pas tous les éléments en interaction avec

J'ai un problème très étrange tout en utilisant mon ListView.

Seule une partie de mes éléments d'adaptateur est affichée dans la liste lors de l'affichage, mais lorsque j'interface avec la liste (c'est-à-dire que je tente de la faire défiler), tous les éléments sont affichés correctement.

  • Android obtient une position de défilement exacte dans ListView
  • Couche de trafic personnalisée pour Google Maps
  • Erreur de compilation Maven d'en-tête invalide pour Android support-v4
  • INSTALL_FAILED_NO_MATCHING_ABIS comment surmonter
  • Faible performance lors de l'exécution eglSwapBuffer et eglMakeCurrent
  • Java.lang.NumberFormatException: Invalid int: "" dans Android
  • Ce fenonemon ne se produit que si j'ai moins d'objets que l'affichage de l'écran. Jetez un oeil à ces captures d'écran ci-dessous.

    Avant l'interaction: Entrez la description de l'image ici

    Après l'interaction: Entrez la description de l'image ici

    Code source d'activité où ajouter des éléments:

    String[] jRests = getResources().getStringArray(R.array.j_restaurants); String[] lRests = getResources().getStringArray(R.array.l_restaurants); items = new ArrayList<Object>(); items.add(getString(R.string.campus_j)); for(String item : jRests){ String[] val = item.split(",,,"); items.add(new FoodSectionListItem(new Restaurant(val[0], val[1], val[2], ""))); } items.add(getString(R.string.campus_l)); for(String item : lRests){ String[] val = item.split(",,,"); items.add(new FoodSectionListItem(new Restaurant(val[0], val[1], val[2], ""))); } getSupportActionBar().setDisplayHomeAsUpEnabled(true); adapter = new BaseSectionAdapter(this, R.layout.list_item_fragment_header); if(!isTabletView()){ adapter.setSelectedItem(-1); } adapter.setItems(items); 

    Code d'adaptateur:

     public class BaseSectionAdapter extends AmazingAdapter { private LayoutInflater inflater; private int selectedItem = 0; private List<Object> items; private List<SectionItem> sections = new ArrayList<SectionItem>(10); private List<Class> itemTypes = new ArrayList<Class>(); private List<Integer> sectionPositions = new ArrayList<Integer>(); private int listHeaderLayoutId; private View headerView; public static interface ISectionListItem { public void setProps(View convertView, int position, int selectedItem); public View getLayout(LayoutInflater inflater); } private class SectionItem implements Serializable { private static final long serialVersionUID = -8930010937740160935L; String text; int position; public SectionItem(String text, int position) { this.text = text; this.position = position; } } public BaseSectionAdapter(Context context, int listHeaderLayoutId) { this.listHeaderLayoutId = listHeaderLayoutId; init(context); } public BaseSectionAdapter(Context context, int listHeaderLayoutId, List<Object> listItems) { this.listHeaderLayoutId = listHeaderLayoutId; init(context); initListItems(listItems); } private void init(Context context) { inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void setSelectedItem(int position) { selectedItem = position; } // public List<ListItem> getItems() { // return items; // } private void initListItems(List<Object> itemList) { int curSection = -1; //int curPosition = 0; //curSection = 0; this.items = itemList; itemTypes.clear(); sections.clear(); sectionPositions.clear(); int listSize = itemList.size(); for(int i = 0; i < listSize; i++){ Object currentItem = items.get(i); if(currentItem instanceof String){ sections.add(new SectionItem((String) currentItem,i)); curSection++; } if(!itemTypes.contains(currentItem.getClass())){ itemTypes.add(currentItem.getClass()); } sectionPositions.add(curSection); } Log.d("test", "No of items = "+items.size()); Log.d("test", "No of itemtypes = "+itemTypes.size()); Log.d("test", "View type count = "+getViewTypeCount()); } public void setItems(List<Object> itemList) { initListItems(itemList); } public int getCount() { return items==null?0:items.size(); } @Override public int getViewTypeCount(){ return (itemTypes.size() == 0)?1:itemTypes.size(); } @Override public int getItemViewType(int position){ return itemTypes.indexOf(items.get(position).getClass()); } @Override public boolean isEnabled(int position){ return !(items.get(position) instanceof String || items.get(position) instanceof EmptySectionListItem); } @Override public Object getItem(int position) { return items.get(position); } public long getItemId(int position) { return position; } @Override protected void onNextPageRequested(int page) { // TODO Auto-generated method stub } @Override protected void bindSectionHeader(View view, int position, boolean displaySectionHeader) { // TextView lSectionTitle = (TextView) view // .findViewById(R.id.txt_list_header); // if (displaySectionHeader) { // lSectionTitle.setVisibility(View.VISIBLE); // lSectionTitle // .setText(getSections()[getSectionForPosition(position)]); // } else { // lSectionTitle.setVisibility(View.GONE); // } } @Override public View getAmazingView(int position, View convertView, ViewGroup parent) { Object curItemObject = items.get(position); boolean isHeader = (curItemObject instanceof String); if(convertView == null){ if(isHeader && headerView != null){ convertView = headerView; }else if(isHeader){ convertView = inflater.inflate(listHeaderLayoutId, null); headerView = convertView; }else{ convertView = ((ISectionListItem) curItemObject).getLayout(inflater); } } if(isHeader){ TextView header = ((TextView)convertView.findViewById(R.id.txt_list_header)); header.setText((String)curItemObject); }else{ ((ISectionListItem)curItemObject).setProps(convertView, position, selectedItem); } return convertView; } @Override public void configurePinnedHeader(View header, int position, int alpha) { TextView textView = ((TextView)header.findViewById(R.id.txt_list_header)); textView.setText(getSections()[getSectionForPosition(position)]); } @Override public int getPositionForSection(int section) { if(section >= sections.size()){ return 0; } return sections.get(section).position; } @Override public int getSectionForPosition(int position) { return sectionPositions.get(position); } @Override public String[] getSections() { String[] res = new String[sections.size()]; for (int i = 0; i < res.length; i++) { res[i] = sections.get(i).text; } return res; } } 

    Code de mise en page:

     LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.HORIZONTAL); FrameLayout listLayout = new FrameLayout(this); LinearLayout.LayoutParams listParams = new LinearLayout.LayoutParams(0, FrameLayout.LayoutParams.MATCH_PARENT); listParams.weight = 1; listLayout.setId(LIST_FRAGMENT_VIEW_ID); FrameLayout detailLayout = new FrameLayout(this); LinearLayout.LayoutParams detailParams = new LinearLayout.LayoutParams(0, FrameLayout.LayoutParams.MATCH_PARENT); detailParams.weight = 2; detailLayout.setId(DETAIL_FRAGMENT_VIEW_ID); layout.addView(listLayout, listParams); layout.addView(detailLayout, detailParams); if(savedInstanceState == null){ FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(listLayout.getId(), (Fragment) listFragment, TWO_PANEL_LIST_FRAGMENT_TAG); ft.add(detailLayout.getId(), detailFragment); ft.commit(); } setContentView(layout); 

  • Comment intégrer la passerelle de paiement ATOM dans mon application?
  • Comment changer la couleur d'un ProgressBar indéfini?
  • Comment utiliser le support FileProvider pour le partage de contenu vers d'autres applications?
  • Détecter backspace dans TextWatcher
  • Texte clignotant dans la vue Android
  • Comment gérer une connexion Bluetooth sur Android via des modifications de configuration?
  • 5 Solutions collect form web for “ListView ne rend pas tous les éléments en interaction avec”

    Essayez d'appeler notifyDataSetChanged () dans la méthode runOnUIThread () comme je l'ai montré ci-dessous et ça fonctionnera comme un charme. 🙂

      runOnUiThread(new Runnable() { @Override public void run() { messageAdapter.notifyDataSetChanged(); } }); 

    L'a résolu !!!

    Le problème était que l'adaptateur essayait de réutiliser le même élément de section. Pas bon!!!

    L'a changé pour gonfler l'élément de section chaque fois que nous frappons une section!

    Je ne sais pas ce qui cause le problème, mais si vous ne trouvez pas une solution logique, vous pouvez essayer quelque chose comme ceci:

    • Déclencher un onTouchEvent() programme chaque fois que vous lancez ListView .
    • Faites défiler vers le bas et sauvegardez par programme dès que ListView est lancé.

    etc..

    Ajoutez le widget ListView à layout.xml et ajoutez le contenu de la liste à cela. N'utilisez pas FrameLayout car c'est probablement le problème. Il s'agit de la mise à jour du contenu après le contact, de sorte que la mise en page est activée, c'est ne pas mettre en œuvre la configuration correcte onCreate () telle que utilisée par le widget ListView.

    Appelez-vous la méthode notifyDataSetChanged () sur votre adaptateur après avoir ajouté de nouveaux éléments? Cela provoque la visualisation de la liste pour actualiser sa vue lorsque l'ensemble de données sous-jacent est modifié.

    Si cela ne fonctionne toujours pas, essayez notifyDataSetInvalidated () qui provoque la redistribution complète de la liste.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.