2012-07-13 13 views
12

Ho un problema molto strano durante l'utilizzo di ListView.ListView non esegue il rendering di tutti gli elementi fino all'interazione con

Solo una parte degli elementi del mio adattatore viene renderizzata in listview sullo schermo ma quando interagisco con il listview (cioè tenta di scorrerlo) tutti gli elementi sono renderizzati correttamente.

Questo fenonemon si verifica solo se ho meno elementi di quanto lo schermo può mostrare. Dai un'occhiata a questi screenshot qui sotto.

Prima di interazione: enter image description here

Dopo interazione: codice enter image description here

fonte di attività in cui l'aggiunta di elementi:

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); 

Codice di adattatore:

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; 
    } 
} 

Codice di aspetto:

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); 
+0

puoi aggiungere qualche codice di adattatore ..? – Kamal

+0

aggiungi il codice sorgente nel punto in cui aggiungi elementi alla fonte di dati di backup della listview e crea la scheda –

+0

anche la sorgente di layout di ListView.:) –

risposta

1

Risolto il problema !!!

Il problema era con l'adattatore che cercava di riutilizzare lo stesso articolo di sezione. Non bene!!!

Cambiato per gonfiare l'elemento della sezione ogni volta che colpiamo una sezione!

+1

puoi aiutarmi, ho lo stesso problema, puoi spiegare come lo hai risolto? devo cliccare sullo schermo per caricare listview –

+1

una risposta corretta dovrebbe elaborare come risolvere il problema, non solo suggerirlo. soprattutto se rispondi alla tua stessa domanda ... – ndori

0

io non so che cosa causa il problema, ma se non si trova una soluzione logica ad esso si potrebbe provare qualcosa di simile:

  • grilletto un onTouchEvent() a livello di codice ogni volta che si avvia il ListView.
  • scorrere verso il basso e il backup a livello di codice non appena viene avviato il ListView.

ecc ..

0

Aggiungi widget di ListView al layout.xml e aggiungi contenuto della lista a quello. Non utilizzare FrameLayout poiché probabilmente è la causa del problema. Sta aggiornando il contenuto dopo il tocco in modo che il layout su cui si trova non stia implementando l'installazione corretta di onCreate() come ha il widget ListView.

+0

cosa vuoi dire che non sta implementando il corretto onCreate? Sto creando il layout in modo programmatico, quindi aggiungo i miei frammenti. Ho provato a cambiare i due FrameLayout in LinearLayout, non ho fatto alcuna differenza:/ – Richard

+0

@Richard Dove stai aggiungendo un ListView? Secondo il tuo codice non stai implementando un ListView. – CommonKnowledge

+0

'ft.add (listLayout.getId(), (Fragment) listFragment, TWO_PANEL_LIST_FRAGMENT_TAG);' im aggiungendo un listfragment – Richard

0

Stai chiamando il metodo notifyDataSetChanged() sull'adattatore dopo aver aggiunto nuovi elementi? Ciò fa sì che la listview aggiorni la sua vista quando il set di dati sottostante viene modificato.

Se ancora non funziona, prova notifyDataSetInvalidated() che provoca il ridisegno completo della listview.

+0

Provato questo. Non ha effetto Comincio a pensare che il listfragment potrebbe essere il problema qui. Sto aggiungendo – Richard

5

prova a chiamare notifyDataSetChanged() nel metodo runOnUIThread() come ho mostrato di seguito e funzionerà come un incantesimo. :)

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

Apparentemente non è la soluzione per la domanda originale, ma questo ha risolto lo stesso problema per me. Chiamare notifyDataSetChanged() da un altro thread non è affidabile. – Ashley

Problemi correlati