当ListView为空时Android显示文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当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>
另一答案

有一个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; } @Override public 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 your list 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. 现在转到

    以上是关于当ListView为空时Android显示文本的主要内容,如果未能解决你的问题,请参考以下文章

    当 listView 为空时,setEmptyView 不显示图像

    WPF - ListView 为空时不显示上下文菜单

    仅当文本字段为空时如何显示图像?

    当字段为空时,如何让内容类型中的链接字段显示默认文本

    Android ListView之setEmptyView的问题

    当搜索字符串为空时,带有连接的搜索查询显示所有行