当ListView为空时Android显示文本

枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述当ListView为空时Android显示文本相关的知识,希望能为你提供帮助。
我正在用TextView设置一个@android:id/empty,以便在ListView中没有项目时显示消息。然而,即使在TextView中有物品出现之前,这个ListView也会显示出来。
我怎样才能使它只在ListView中没有元素时显示?

< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > < ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="fill_parent" android:dividerHeight="1dp" > < /ListView> < TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/empty_list" /> < /LinearLayout>

PS:我正在使用LoaderSimpleCursorAdapterListFragment
答案我猜你使用的是常规的FragmentActivity,里面有ListView。如果是,则必须手动将空布局添加到ListView
EG
ListView lv = (ListView)findViewById(android.R.id.list); TextView emptyText = (TextView)findViewById(android.R.id.empty); lv.setEmptyView(emptyText);

然后当你的适配器为空时,你的ListView会自动使用这个视图
如果您使用的是ListActivity,则无需在setEmptyView()上调用ListView,因为ListActivity会自动为您管理。
另一答案当TextView为空时,设置一个ListView并为其指定任何想要显示的内容:
ProjectListAdapter projectListAdapter = new ProjectListAdapter(); TextView empty=(TextView)findViewById(R.id.empty); projectsListView.setEmptyView(empty);

在我的xml文件中,我们编写以下代码
< TextView android:id="@+id/empty" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="Your text here" android:textColor="#FFFFFF" />

另一答案我有这个问题。您必须在代码中显式设置emptyView。
改变你的TextView
< TextView android:id="@+id/emptyResults" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/empty_list" />

然后在onCreate()
listViewResults = (ListView) findViewById(R.id.list); listViewResults.setEmptyView((LinearLayout) findViewById(R.id.emptyResults));

上面的代码假设您的ListViewLinearLayout中。
另一答案我使用ListFragment并遇到了同样的问题。我尝试了这个答案的所有变种,但问题没有解决。
所以我找到了我的变体,以覆盖setEmptyText()
public class NewsFragment extends ListFragment{ private TextView emptyText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //...emptyText = (TextView)view.findViewById(android.R.id.empty); //... }@Override public void setEmptyText(CharSequence text) { emptyText.setText(text); } }

希望它会对某人有所帮助。
另一答案我知道这有点晚了,但是要使用XML工作,你需要加重你的ListView并让你的TextView match_parent
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > < ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:dividerHeight="1dp" > < /ListView> < TextView android:id="@android:id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/empty_list" /> < /LinearLayout>

另一答案【当ListView为空时Android显示文本】有一个good example如何做它工作真棒:
如果要在ListView为空时向用户显示消息,则必须记住以下3个步骤:
  • 在声明ListView的xml中,在TextView正下方创建一个LinearLayout(如果需要,TextView可以在ListView内)
  • TextView的id设置为“emptyElement”
  • 在活动中,将setEmptyView()属性设置为ListView
1-创建一个xml,它将保存ListView并将其命名为“my_activity”,并将其命名为“MyActivity”。
  1. 现在,在刚创建的xml“my_activity”中,您必须设置ListView。在ListView正下方,你将不得不添加一个TextView。这将用于显示空消息。
重要说明:TextView必须具有以下名称:“空元素”。此名称是必填项。如果您使用其他名称,则不会显示该消息。
这就是“my_activity”xml应该是这样的:
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MyActivity"> < ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/listView"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/emptyElement" android:text="The list is empty" android:textStyle="bold" android:textSize="15sp" android:visibility="gone" android:layout_centerInParent="true" android:textColor="@android:color/darker_gray"/> < /RelativeLayout>

  1. 创建一个用于显示项目的xml(当列表不为空时),并将其命名为“list_item”。 < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/list_item_text_view" android:textSize="20sp" android:padding="10dp" android:layout_marginLeft="5dp"/>
  2. 为自定义适配器创建一个新的java类,ListView将使用它并命名为“MyCustomAdapter”。适配器的代码如下: import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; public class MyCustomAdapter extends BaseAdapter { private ArrayList< String> mListItems; private LayoutInflater mLayoutInflater; public MyCustomAdapter(Context context, ArrayList< String> arrayList){mListItems = arrayList; //get the layout inflater mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }@Override public int getCount() { //getCount() represents how many items are in the list return mListItems.size(); }@Override //get the data of an item from a specific position //i represents the position of the item in the list public Object getItem(int i) { return null; }@Override //get the position id of the item from the list public long getItemId(int i) { return 0; }@Overridepublic View getView(int position, View view, ViewGroup viewGroup) {// create a ViewHolder reference ViewHolder holder; //check to see if the reused view is null or not, if is not null then reuse it if (view == null) { holder = new ViewHolder(); view = mLayoutInflater.inflate(R.layout.list_item, null); holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view); // the setTag is used to store the data within this view view.setTag(holder); } else { // the getTag returns the viewHolder object set as a tag to the view holder = (ViewHolder)view.getTag(); }//get the string item from the position "position" from array list to put it on the TextView String stringItem = mListItems.get(position); if (stringItem != null) { if (holder.itemName != null) { //set the item name on the TextView holder.itemName.setText(stringItem); } }//this method must return the view corresponding to the data at the specified position. return view; }/** * Static class used to avoid the calling of "findViewById" every time the getView() method is called, * because this can impact to your application performance when yourlist is too big. The class is static so it * cache all the things inside once it's created. */ private static class ViewHolder {protected TextView itemName; } }
  3. 现在转到

      推荐阅读