当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:我正在使用Loader
和SimpleCursorAdapter
和ListFragment
。
我猜你使用的是常规的Fragment
或Activity
,里面有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));
上面的代码假设您的ListView
在LinearLayout
中。
我使用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”。
- 现在,在刚创建的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>
- 创建一个用于显示项目的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"/>
- 为自定义适配器创建一个新的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; } }
- 现在转到
以上是关于当ListView为空时Android显示文本的主要内容,如果未能解决你的问题,请参考以下文章
当 listView 为空时,setEmptyView 不显示图像