2017-07-15 1 views
0

Un problème spécifique est l'échec de l'appel de la méthode getView de mon arrayadapter personnalisé. J'utilise un fragment pour afficher une liste. L'activité qui engendre la liste permet à une personne d'être sélectionnée à partir d'un spinner. Je récupère ensuite les données d'une base de données en utilisant l'identifiant de la personne sélectionnée. Je conditionne ces données dans un objet support personnalisé affecté à une ArrayList. Voici le code d'activité qui crée une transaction de fragment.Android ListView et Fragment

FragmentTransaction fragmentTransaction = 
    getSupportFragmentManager().beginTransaction(); 

NotesListViewFragment notesListViewFragment = new NotesListViewFragment(); 
Bundle bundle = new Bundle(); 
bundle.putParcelableArrayList(Constants.NOTES_LIST, (ArrayList) rowValues); 
notesListViewFragment.setArguments(bundle); 
fragmentTransaction.add(notesListViewFragment, "FRAG"); 
fragmentTransaction.commit(); 

Le fragment obtient correctement les données groupées. La méthode onCreate s'exécute correctement, tout comme la méthode onCreateView. Voici le code onCreateView:

View view = inflater.inflate(R.layout.note_list_fragment_layout, null); 
    ListView notesListView = (ListView) 
view.findViewById(android.R.id.list); 
    //ListView notesListView = (ListView) view.findViewById(android:list); 

notesListView.addHeaderView(inflater.inflate(R.layout.notes_list_headings, 
    container, false)); 
View footer = ((LayoutInflater) context.getSystemService 
      (Context.LAYOUT_INFLATER_SERVICE)) 
      .inflate(R.layout.notes_list_footer, null); 
TextView v = (TextView) footer.findViewById(R.id.total_notes); 
v.setText(Integer.toString(notesList.size())); 
v.setTypeface(font); 
footer.setPadding(30, 25, 0, 0); 
notesListView.addFooterView(footer); 

CustomNotesListAdapter adapter = new CustomNotesListAdapter(context, 
      R.layout.notes_list_row_layout, notesList); 
      //R.layout.notes_list_row_layout, notesList, false); 
adapter.notifyDataSetChanged(); 
notesListView.setAdapter(adapter); 
//setListAdapter(adapter); 

return view; 

Après l'adaptateur est créé, il contient les données dans le « notesList ». Le constructeur de l'adaptateur et la méthode getCount sont appelés, ce qui renvoie le nombre correct de lignes. La méthode getView n'est jamais appelée et rien n'est affiché sur l'appareil. Voici la méthode getView.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewHolder viewHolder = null; 
NoteListHolder noteListHolder = getItem(position); 

if (convertView == null) { 
    //LayoutInflater inflater = (LayoutInflater) context 
       //.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = ((LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE)) 
       .inflate(layoutResourceId, null); 
    viewHolder = new ViewHolder(); 
     viewHolder.imageView = (ImageView) 
    convertView.findViewById(R.id.note_image); 
     viewHolder.noteText = (TextView) 
    convertView.findViewById(R.id.note_text); 
     viewHolder.updatedDate = (TextView) 
convertView.findViewById(R.id.updated_date); 
     viewHolder.updatedBy = (TextView) 
convertView.findViewById(R.id.updated_date); 
     viewHolder.noteSource = (TextView) 
convertView.findViewById(R.id.note_source); 
     convertView.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.noteText.setText(noteListHolder.getNote()); 
    viewHolder.noteSource.setText(noteListHolder.getNoteSource()); 
    viewHolder.updatedDate.setText(noteListHolder.getLastUpdated()); 
    viewHolder.updatedBy.setText(noteListHolder.getLastUpdatedBy()); 

    return convertView; 

Voici la mise en page xml ListView:

<ListView 
    android:id="@+id/android:list" 
    style="@style/MyMaterialTheme.Base" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:divider="@android:color/black" 
    android:dividerHeight="5dp" 
    android:drawSelectorOnTop="true" > 

J'ai cinq ou six scénarios similaires dans l'application, tout fonctionne correctement. La seule différence est l'utilisation d'un fragment pour contenir la liste.

Espérons que quelqu'un aura la patience de lire ceci et merci pour toute idée.

+0

ce qui se passe si vous supprimez le 'if (convertView == null)' vérifier? – Rafa

Répondre

0

Avant

if(convertView) { 
... 
} 

Vous voulez gonfler votre layoutResourceId

LayoutInflater inflater = context.getLayoutInflater(); 
View rowView = inflater.inflate(layoutResourceId, null, true); 
... 
return rowView; 
+0

Merci. Mais la méthode getView n'est pas appelée, donc elle n'obtient jamais le code suggéré. – user3574607

+0

Réplication du code fragment dans une activité et utilisation de l'intention de tirer, tout fonctionne comme prévu, alors qu'est-ce qui est si spécial à propos d'un fragment? – user3574607