Пустое представление о списке. Не работает
-
26-10-2019 - |
Вопрос
Я вытаскиваю волосы, пытаясь понять это. Из всех учебных пособий, которые я читал, то, как у меня есть эта установка. У меня есть список, которая использует пользовательский адаптер для отображения некоторых данных. Я хотел бы отобразить сообщение «Нет элементов», если адаптер пуст.
Это моя макет:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/BaseStyle"
android:orientation="vertical"
android:padding="5dip"
>
<ListView android:id="@android:id/list"
style="@style/BaseStyle"
/>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/empty"
style="@style/BaseStyle.Title"
android:text="No Items Found"
/>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
style="@style/BaseStyle.Title"
android:layout_alignParentTop="true"
/>
</RelativeLayout>
Это мой код:
public class Main extends ListActivity {
private CustomAdapter adapter;
private String[] items = {};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
adapter = new CustomAdapter();
PopulateItems();
for (String item : items)
adapter.addItem(item);
this.setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
private class CustomAdapter extends BaseAdapter {
private String[] mData;
private LayoutInflater mInflater;
public CustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(String item) {
mData.add(item);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
String item = (String)this.getItem(position);
if (convertView == null)
{
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.main, parent, false);
holder.text = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
TextView tvText = holder.text;
tvText.setText(item);
}
static class ViewHolder {
TextView text;
}
То, что происходит, - это текст «Нет элементов», пока отображается нормально, когда строковый массив «элементы» не имеет данных. В методе PopulateItem () есть процесс, который будет заполнять массив данными, и если есть данные, текст «нет элементов», текст все еще можно увидеть в каждой строке листинга »внизу» данных. Таким образом, пустой текст в основном накладывается на данные.
Решение
Я не уверен, что вы сделали какие -либо опечатки в своем вопросе для вашего кода. Похоже, вы разбираете части своего кода, прежде чем публиковать его здесь.
getView () предназначен для вас, чтобы создать вид на конкретный ряд в вашем списке. Я предполагаю, что вы на самом деле раздували свой main.xml, который является вашим RELATIVELAYOUT, содержащим LISTVIEW, EMPECTVIEW и еще один TextView.
Если ваш ListView - это только Dislay Strings, просто создайте экземпляр TextView и верните его в GetView
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
String item = (String)this.getItem(position);
if (convertView == null)
{
convertView = new TextView(context);
}
convertView.setText(item);
return convertView
}
Пропустите контекст через конструктор вашего пользовательского адаптера
РЕДАКТИРОВАТЬ: Показание нескольких TextViews в одной строке
Если я собираюсь быть строгим об этом, проблема не в линии ConvertView = minflater.inflate (). Ошибка в файле надуваемой. Обычно легче надувать другой XML -файл, если у вас есть более сложное представление для каждой строки в вашем списке. Более ранняя ошибка - что -то, казалось бы, рекурсивное надувание Main.xml
Чтобы обрабатывать несколько TextView, сделайте STH, как это:
Создайте еще один XML -файл, чтобы представить каждую строку в вашем списке, list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
.....
>
<TextView android:id="@+id/list_text_1"
....
/>
<TextView android:id="@+id/list_text_2"
....
/>
<TextView android:id="@+id/list_text_3"
....
/>
</LinearLayout>
В вашей реализации GetView в вашем адаптере,
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
String item = (String)this.getItem(position);
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.list_item.xml, parent, false);
//link list_text_1, list_text_2, list_text_3 as you need to the individual
// textviews
}
else {
// TODO linking up the textviews when convertView is not null
}
return convertView
}
Вероятно, это хорошее время, чтобы привлечь шаблон владельца просмотра, учитывая, что вам нужно надуть файл XML. Страница 11/19 файла PDF, связанного в этом отвечать дает довольно хорошее объяснение о моделях Viewholder.
Наконец, прочитайте больше примеров ListView и соблюдайте, когда они используют Inflater в GetView и какие Они на самом деле раздувают.
Другие советы
Поскольку ваш текстовый вид с идентификатором «пустой» все еще видна, установите видимость этого представления как невидимое изначально, и если список пуст, только сделайте его видимым,
Посмотрите на Android: видимость = "невидимый" параметр.
и в коде, если список пуст yourtextview.setvisibility (view.visibile)