2013-04-27 13 views
10

Ho un Adattatore personalizzato con un ListFragment ma gli adattatori getView() non vengono richiamati affatto.L'adattatore personalizzato getview non si chiama

Questo è come l'adattatore sembra -

public class ModuleListItemAdapter extends BaseAdapter { 

    List<ModuleItem> list; 
    Context context; 
    Module mod; 

    public ModuleListItemAdapter() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public ModuleListItemAdapter(Context context, List<ModuleItem> list, Module mod) { 
     super(); 
     this.list = list; 
     this.context = context; 
     this.mod = mod; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.moduleitem, null); 
     GenerateModuleItemView gmiv = new GenerateModuleItemView(context); 
     rl.addView(gmiv.itemDispView(mod.getFields(), list.get(position))); 
     return rl; 
    } 

    public void setValue(List<ModuleItem> l) { 
     this.list = l; 
     notifyDataSetChanged(); 
    } 

    public void addValue(ModuleItem item) { 
     this.list.add(item); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

e il frammento -

public class ModuleItemListFragment extends ListFragment { 

    List<ModuleItem> list; 
    Module mod; 

    public ModuleItemListFragment() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public ModuleItemListFragment(List<ModuleItem> list, Module mod) { 
     super(); 
     this.list = list; 
     this.mod = mod; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     return inflater.inflate(R.layout.list, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ModuleListItemAdapter adapter = new ModuleListItemAdapter(getActivity(), list, mod); 
     setListAdapter(adapter); 
    } 
} 

Ed è così che il mio layout assomiglia -

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:divider="#000000" 
      android:dividerHeight="1dip" /> 

non lo faccio sapere qual è il problema qui

+2

'@Override public int getCount() { return list.size(); } '. Si prega di utilizzare Google prima di fare una domanda. – Luksprog

+0

@Luksprog non funziona anche se – Akilan

+2

Come ha detto Luksprog, è necessario aggiungere qualcosa a getCount. Non proverai a creare nessuna vista se pensi che tu voglia 0. – alex

risposta

32

È perché getCount() restituisce zero. Il numero che si restituisce in getCount() è il momento in cui viene chiamato getView(). In getCount() si dovrebbe sempre restituire la dimensione della lista.

Pertanto

@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public ModuleItem getItem(int position) { 
    return list.get(position); 
} 

Inoltre, forse il layout di ListView id non è android.R.id.list?

Accertarsi che siano presenti in XML

<ListView 
    android:id="@android:id/list" 
    ... 

Inoltre, non sempre passare tutti i dati a un frammento nel costruttore.

SBAGLIATO:

public ModuleItemListFragment(List<ModuleItem> list,Module mod) { 
    super(); 
    this.list=list; 
    this.mod=mod; 
} 

DESTRA:

private static final String EXTRA_LIST = "ModuleItemListFragment.EXTRA_LIST"; 
private static final String EXTRA_MODULE = "ModuleItemListFragment.EXTRA_MODULE"; 

public static ModuleItemListFragment instantiate(ArrayList<ModuleItem> list, Module mod) { 
    final Bundle args = new Bundle(); 
    args.putParcelable(EXTRA_LIST, list); 
    args.putParcelable(EXTRA_MODULE, module); 

    final ModuleItemListFragment f = new ModuleItemListFragment(); 
    f.setArguments(args); 
    return f; 
} 

@Override 
public void onCreate(Bundle state) { 
    super.onCreate(state); 
    final Bundle args = getArguments(); 
    this.list = args.getParcelable(EXTRA_LIST); 
    this.module = args.getParcelable(EXTRA_MODULE); 
} 

Naturalmente, è necessario rendere il vostro modulo Parcelable o Serializable.

È necessario specificare arg perché il Frammento può essere ucciso e ripristinato dal sistema e se si passano i dati tramite setter o costruttori essi non verranno ripristinati e pertanto in alcune circostanze possono diventare nulli.

+0

Grazie mille .. :) le lezioni apprese gli errori accadono lungo la strada ..: P – Akilan

0

Ho lo stesso problema, nel mio caso non ho inizializzato la mia lista di array locale nel mio costruttore Fragment.

ArrayList<Image> mImageList; 

public ImageCategoryAdapter(Context context, ArrayList<Image> itemList) { 
    super(context, 0); 

    mImageList = itemList; 
} 

Ho perso la parte mImageList = itemList;.

È solo un errore manuale, ma potrebbe essere utile a qualcuno che si trova ad affrontare lo stesso problema.

0

Il metodo getView() sta chiamando quando il set di dati ha almeno un record da visualizzare nella vista.

getView(): Restituisce: A Visualizza corrispondente ai dati nella posizione specificata.

E se la dimensione del set di dati è 0, pertanto, la posizione è anche 0.

Di conseguenza il metodo GetView() non sta chiamando.

0

Ho avuto questo problema e nel mio caso, il problema era che ho erroneamente creato 2 adattatori. Uno di questi stavo passando a setAdapter e l'altro che stavo usando per aggiungere elementi all'utilizzo di add. Quindi l'adattatore che importava non veniva mai aggiunto.

2

Ho risolto questo problema in modo pulito leggendo il codice ArrayAdapter. Apparentemente mantiene riferimento a una lista interna di oggetti. Tutto quello che dovevo fare era di passare il mio puntatore ArrayList al super costruttore così:

public FriendsAdapter(Context context, int resource, ArrayList<FriendItem> friends) { 
    super(context, resource, friends); 
} 

e non ho dovuto ignorare qualsiasi getItem o getCount metodi.

Nota: questo è per ArrayAdapter e livello API 23+, pertanto potrebbe non essere applicabile.

Problemi correlati