2012-12-29 7 views
6

Uso un paginator con alcuni Fragments.Come utilizzare setEmptyView() con layout elenco personalizzato in ListFragment

Desidero visualizzare un messaggio quando non ci sono voci nell'elenco (Fragment).

Ho provato a utilizzare Textview con android:id="@id/android:empty ma non funziona.

personalizzato codice layout della lista:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="@dimen/padding_medium" > 

    <TextView 
     android:id="@+id/label_value" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="@dimen/padding_medium" 
     android:text="@string/label_value" 
     android:textColor="@android:color/white" 
     android:textSize="18sp" /> 

    <TextView 
     android:id="@+id/label_date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="@dimen/padding_medium" 
     android:text="@string/title_time" 
     android:textColor="@android:color/white" 
     android:textSize="16sp" /> 

</RelativeLayout> 

Lista adattatore classe:

public class JournalAdapter extends ArrayAdapter<String> { 

    private final Context context; 
    private final List<String> values; 
    private final List<String> dates; 

    public JournalAdapter(Context context, List<String> values, 
      List<String> dates) { 
     super(context, R.layout.layout_journal_list, values); 

     this.context = context; 
     this.values = values; 
     this.dates = dates; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View rowView = inflater.inflate(R.layout.layout_journal_list, parent, false); 

     TextView value = (TextView) rowView.findViewById(R.id.label_glucose); 
     TextView date = (TextView) rowView.findViewById(R.id.label_date); 

     value.setText(values.get(position)); 
     date.setText(dates.get(position)); 

     return rowView; 
    } 

} 

Lista metodo di analisi:

private void initListView() { 
     values = dataSource.getAllValues(); 

     List<String> values = new ArrayList<String>(); 
     List<String> dates = new ArrayList<String>(); 

     for (Value value : values) { 
      values.add(Double.toString(value.getValue())); 
      dates.add(secondsToDate(value.getDate())); 
     } 

     setListAdapter(new JournalAdapter(context, values, dates)); 

     listView = getListView(); 
     listView.setEmptyView(noItems("NO ITEMS")); 
     listView.setOnItemClickListener(this); 
    } 

noItems metodo:

private TextView noItems(String text) { 
     TextView emptyView = new TextView(context); 
     emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.FILL_PARENT)); 
     emptyView.setText(text); 
     emptyView.setTextColor(Color.WHITE); 
     emptyView.setTextSize(20); 
     emptyView.setVisibility(View.GONE); 
     emptyView.setGravity(Gravity.CENTER_VERTICAL 
       | Gravity.CENTER_HORIZONTAL); 

     return emptyView; 
    } 
+0

C'è qualche ragione per impostare la visibilità di 'TextView' che crei nel metodo' noItems() 'su ** View.GONE **? – Luksprog

+0

Copia questo codice da qui http://stackoverflow.com/questions/4088711/android-listview-default-text-when-no-items. A proposito, ho provato a rimuovere questa riga e anche a VISIBILE, ma sempre la stessa. – burjulius

+1

Puoi provare ad impostare il 'TextView' vuoto una sola volta (ad esempio in' onActivityCreated') nel tuo 'ListFragment' e poi semplicemente aggiornare il suo testo (cerca il' TextView' con 'findViewById()' (ovviamente aggiungendo un id (come 'android.R.id.empty')))? – Luksprog

risposta

23

Questo ha funzionato per me (ottenuto la soluzione da this question chiesto da William Remacle). Che cosa si potrebbe avere perso è aggiungendo il creato TextView al ListView layout di genitore (seconda riga di codice dalla parte inferiore del metodo noItems sottostante):

Nel mio ListFragment ho usato il seguente metodo per ottenere una vista per la vista vuoto:

private TextView noItems(String text) { 
    TextView emptyView = new TextView(getActivity()); 
    //Make sure you import android.widget.LinearLayout.LayoutParams; 
    emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
      LayoutParams.MATCH_PARENT)); 
    //Instead of passing resource id here I passed resolved color 
    //That is, getResources().getColor((R.color.gray_dark)) 
    emptyView.setTextColor(getResources().getColor(R.color.gray_dark)); 
    emptyView.setText(text); 
    emptyView.setTextSize(12); 
    emptyView.setVisibility(View.GONE); 
    emptyView.setGravity(Gravity.CENTER_VERTICAL 
      | Gravity.CENTER_HORIZONTAL); 

    //Add the view to the list view. This might be what you are missing 
    ((ViewGroup) getListView().getParent()).addView(emptyView); 

    return emptyView; 
} 

Poi nel metodo del l'ListFragmentonStart() impostare la visualizzazione vuoto:

@Override 
public void onStart() { 
    super.onStart(); 
    getListView().setEmptyView(
      noItems(getResources().getString(R.string.widget_empty))); 
} 
+1

Questo ha funzionato in modo più affidabile per me quando si inseriva 'emptyView' come primo figlio:' ((ViewGroup) getListView(). GetParent ()). addView (emptyView, 0); 'in modo che non si sovrapponga a' ListView'. – TalkLittle

+0

Ha funzionato come un fascino.Sono d'accordo con @TalkLittle, è molto più affidabile rispetto all'utilizzo della visualizzazione personalizzata nel layout. Grazie! – GiveEmTheBoot

+0

Dopo una stancante ricerca ... finalmente sopra la soluzione ha funzionato per me! Grazie a @fahmy! – TTP

2
android:id="@android:id/empty" 

e non

android:id="@id/android:empty" 
+0

Ancora lo stesso. A proposito, la documentazione Android scrive @ id/android: vuoto, non @android: id/vuoto. Riferimento - http://developer.android.com/reference/android/app/ListFragment.html – burjulius

Problemi correlati