35

に項目がない場合にメッセージを表示するTextViewIDを設定しています。ただし、アイテムが表示される直前に、アイテムが含まれている場合でも表示されます。@android:id/emptyListViewTextViewListView

に要素がない場合にのみ表示されるようにするにはどうすればよい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:私はaLoaderとaSimpleCursorAdapterを使用していListFragmentます。

4

7 に答える 7

106

レギュラーを使っているのFragmentActivityListView中に入れているのかと思います。その場合は、空のレイアウトをListView手動で追加する必要があります。

例えば

ListView lv = (ListView)findViewById(android.R.id.list);
TextView emptyText = (TextView)findViewById(android.R.id.empty);
lv.setEmptyView(emptyText);

次に、ListViewアダプタが空のときにこのビューを自動的に使用します

を使用している場合は、自動的に管理されるため、ListActivityを呼び出す必要はありません。setEmptyView()ListViewListActivity

于 2012-04-04T18:39:05.683 に答える
11

を設定し、が空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" />
于 2013-12-05T10:34:18.177 に答える
5

私はこの問題を抱えていました。コードで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

于 2012-04-04T18:43:12.740 に答える
4

私は使用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);
    }
}

それが誰かのために役立つことを願っています。

于 2014-03-05T15:03:25.457 に答える
4

これはちょっと遅いことは知っていますが、XMLで機能させるには、に重みを付けListViewて、TextViewmatch_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>
于 2014-06-26T06:47:32.260 に答える
2

それを行う方法の良い例があります。これは素晴らしい働きをします。

が空のときにユーザーにメッセージを表示する場合はListView、次の3つの手順に注意する必要があります。

  • ListViewが宣言されているxmlで、 (必要に応じ TextViewてTextViewをaの中に入れることができます)を作成します。LinearLayoutListView
  • TextView'sidを「emptyElement」として 設定します</li>
  • アクティビティ内で、setEmptyView()プロパティをに 設定しますListView

1-を保持し、ListView「my_activity」という名前のxmlと「MyActivity」という名前のアクティビティを作成します。

  1. ここで、作成したばかりのxml「my_activity」で、を設定する必要がありますListView。そして、のすぐ下にListView、を追加する必要がありますTextView。これは、空のメッセージを表示するために使用されます。

重要:TextViewのIDには、「emptyElement」という名前が必要です。この名前は必須です。別の名前を使用すると、メッセージは表示されません。

「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. ListViewで使用されるカスタムアダプタ用の新しいJavaクラスを作成し、「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. 次に、MyActivityクラスに移動して、以下のコードを追加します。

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView; 
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class MyActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
    
        ListView listView = (ListView) findViewById(R.id.listView);
    
        // Create an empty array list of strings
        List<String> items = new ArrayList<String>();
    
        // Set the adapter
        MyCustomAdapter adapter = new MyCustomAdapter(items);
        listView.setAdapter(adapter);
    
        // Set the emptyView to the ListView
        listView.setEmptyView(findViewById(R.id.emptyElement));
     }
     }
    
于 2018-01-27T17:44:03.150 に答える
0
 TextView tv=(TextView) view.findViewById(R.id.empty);
 tv.setVisibiliy(View.GONE);
于 2020-04-25T05:26:40.150 に答える