How to use setEmptyView () with a custom list in ListFragment

I am using a paginator with several fragments.

I want to show a message when there are no records in the list ( Fragment ).

I tried using Textview with android:id="@id/android:empty , but it does not work.

Custom List Layout Code:

 <?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> 

List of adapter classes:

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

List parsing method:

 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 :

 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; } 
+6
source share
2 answers

This worked for me (got a solution from this question at the request of William Remacle ). Perhaps you missed adding the created TextView to the parent ListView parent layout (second line of code at the bottom of the noItems method below):

In my ListFragment I used the following method to get the view for an empty view:

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

Then in the onStart() method of the ListFragment set the empty view:

 @Override public void onStart() { super.onStart(); getListView().setEmptyView( noItems(getResources().getString(R.string.widget_empty))); } 
+23
source
  android:id="@android:id/empty" 

but not

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

All Articles