Показать TextView для пустого ListView внутри FrameLayout

У меня есть макет с вкладками и деятельность с использованием вкладок в качестве представлений. Он имеет три вкладки какListViews, Если один из списков пуст, я хочу показать простойTextView вместо. Я просмотрел много постов, но все они говорят об одномListView внутриLinearLayout, Я не уверен, что он не работает из-за несколькихListViews или жеFrameLayout, Разве мы не можем установитьvisibility = GONE внутриFrameLayout? Потому что даже тогдаTextView всегда отображается вместе сListView, Кто-нибудь может подсказать, что можно сделать в этом сценарии?

Я также пытался в том числеTextView в другом XML-файле. Но я не уверен, как это добавитьTextView к моемуFrameLayout.

Это то, что я делаю для всех трехListViews

TextView empty = (TextView) findViewById(R.id.blank);
FrameLayout frameLayout = (FrameLayout) findViewById(android.R.id.tabcontent);

mListView_top10 = (ListView)findViewById(R.id.Top_10);
if(TopWR.size()!=0) {
      mListView_top10.setAdapter(new ArrayAdapter<String>(this, R.layout.listview_row,TopWR));
} else {
  frameLayout.addView(empty);
}

FrameLayout

<FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"        
        android:background="@drawable/innerdashboard_bg"
        android:layout_weight="1">


            <ListView 
            android:id="@+id/Top_10"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:paddingRight="5dp" 
            android:text="this is a tab" />


        <ListView 
            android:id="@+id/Billable"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:paddingRight="5dp" 
            android:text="this is another tab" />


        <ListView
            android:id="@+id/Product"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:paddingRight="5dp"
            android:textSize="14sp"
            android:text="this is a third tab" />

 </FrameLayout>

TextView

<TextView  xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/blank"
            android:gravity="center"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="No records Avaible"
            android:textColor="#ffffff" />

EDIT

Я также пытался использоватьsetEmptyViewдля всех трехListViews использование отдельных пустых представлений не работает!

TextView empty1 = (TextView) findViewById(R.id.blank1);
mListView_top10 = (ListView)findViewById(R.id.Top_10);
mListView_top10.setEmptyView(empty1);
mListView_top10.setAdapter(new ArrayAdapter<String>(this, R.layout.listview_row,TopWR));

XML:

<FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/innerdashboard_bg"
        android:layout_weight="1">


        <LinearLayout 
            android:id="@+id/Top_10"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <ListView 
            android:id="@+id/Top_10"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:paddingRight="5dp" 
            android:text="this is a tab" />

            <TextView  
            android:id="@+id/blank1"
            android:gravity="center"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="No records Avaible"
            android:textColor="#ffffff" />

        </LinearLayout>


        <LinearLayout 
            android:id="@+id/Billable"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        <ListView 
            android:id="@+id/Billable"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:paddingRight="5dp" 
            android:text="this is another tab" />

        <TextView  
            android:id="@+id/blank2"
            android:gravity="center"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="No records Avaible"
            android:textColor="#ffffff" />

        </LinearLayout>

        <LinearLayout 
            android:id="@+id/Product"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        <ListView
            android:id="@+id/Product"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:paddingRight="5dp"
            android:textSize="14sp"
            android:text="this is a third tab" />

        <TextView  
            android:id="@+id/blank3"
            android:gravity="center"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="No records Avaible"
            android:textColor="#ffffff" />

        </LinearLayout>

</FrameLayout>

Ответы на вопрос(4)

-коде?

TextView empty = (TextView) findViewById(R.id.blank);
FrameLayout frameLayout = (FrameLayout) findViewById(android.R.id.tabcontent);


mListView_top10 = (ListView)findViewById(R.id.Top_10);
      if(TopWR.size()!=0) {
          mListView_top10.setVisibility(View.VISIBLE);
          mListView_top10.setAdapter(new ArrayAdapter<String>(this,
                    R.layout.listview_row,TopWR));


      }
      else {
          mListView_top10.setVisibility(View.GONE);
          empty.setVisibility(View.VISIBLE);
          frameLayout.addView(empty);

      }

TextView

<TextView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/blank"
        android:visibility="gone"
        android:gravity="center"
        android:layout_width="fill_p,arent"
        android:layout_height="fill_parent"
        android:text="No records Avaible"
        android:textColor="#ffffff" />
 Harsh13 июл. 2012 г., 05:42
Это:Exception[Ljava.lang.StackTraceElement;@4063add0
 Harsh13 июл. 2012 г., 05:18
Не работает! Я думаю, что addView вызывает проблему. Я получаю исключение.
 13 июл. 2012 г., 05:37
Что сказал исключение?
 13 июл. 2012 г., 05:07
Я отредактировал новую версию с другим подходом
 Harsh13 июл. 2012 г., 05:01
Да уж! Я тоже это попробовал. Проблема с видимостьюTextView Он отображается, даже если список не пуст

ViewStub здесь сListView внутри FrameLayout. Когда у вашего ListView есть данные, вы можете использоватьVIEW.GONE вViewStub и если в вашем ListView нет данных, используйтеVIEW.VISIBLE для ViewStub. Вы можете скачать пример сgithub и заставить его работать.

 14 июл. 2012 г., 06:30
Проверьте это для ArrayAdapter и прочитайте блог, чтобы получить лучшую идею ..android.cyrilmottier.com/?p=422
 Harsh13 июл. 2012 г., 15:40
Должен ли я создать еще один класс, какCheeseAdapter и сделать это распространяться наBaseAdapter? Я имею в виду, почему это не сработало?
 Harsh13 июл. 2012 г., 16:19
У меня есть несколькоListViews внутриFrameLayout, Нужно ли иметь несколькоViewStub также?
 13 июл. 2012 г., 15:42
Нет, поскольку вы используете встроенный ArrayAdapter, вы можете просто создать метод, который проверяет размер коллекции и работает соответствующим образом.
 Harsh13 июл. 2012 г., 15:46
Я попробовал это. это не сработало! Я имею в видуTextView был виден, даже когда список не был пустым. Но я не использовалViewStub затем. Это было простоTextView, Это было то, чего не хватало тогда?

добавив пустой элемент, когда список пуст. Следующий пример основан на вашем коде перед редактированием:

FrameLayout frameLayout = (FrameLayout) findViewById(android.R.id.tabcontent);

mListView_top10 = (ListView)findViewById(R.id.Top_10);
if (TopWR.size() == 0) {
  // add a single item to the array, in order to indicate the list is empty
  TopWR.add("The List Is Empty");
}
mListView_top10.setAdapter(new ArrayAdapter<String>(this, R.layout.listview_row,TopWR));

Если вы хотите узнать, как отображается пустой список, вы можете заменить ArrayAdapter на собственный адаптер. Вы также можете использовать другой адаптер, когда список пуст.

 Harsh20 июл. 2012 г., 18:27
Это то, на что я сейчас согласен. Но отображение пустого списка в виде элемента списка с измененным текстом не является хорошим подходом. В конце концов, это похоже на элемент списка. Я хотел показатьTextView вместо этого в середине макета с его собственным шрифтом, чем отображение текста в левом углу страницы, как если бы он был подлинным элементом списка. Спасибо хоть!

setEmptyView(...) на вашеListViewпроходя вTextView в качестве аргумента.

TextView empty = (TextView) findViewById(R.id.blank);
mListView_top10.setEmptyView(empty);

ListView должен автоматически позаботиться о переключении видимости «пустого»; Посмотреть.

Совет: поскольку аргумент является общимViewВы можете перейти в любой подклассViewили более сложная иерархия представлений.

На заметку: вам, вероятно, придется дать каждомуListView свой собственныйTextView экземпляр как пустой вид, чтобы избежать конфликтных ситуаций; например когда в одном списке есть содержание, а в другом нет.

 Harsh13 июл. 2012 г., 06:03
Я отредактировал свой код. Пожалуйста, посмотрите еще раз. Я продолжаю получать этоException[Ljava.lang.StackTraceElement;@4063add0
 Harsh13 июл. 2012 г., 04:54
Я попробовал это. Но это не работает! Я предполагаю, что это потому, что моя деятельность не распространяетсяListActivity. setEmptyView работает только подListActivity право?

Ваш ответ на вопрос