【发布时间】:2015-07-08 06:02:46
【问题描述】:
让我快速声明这里有一个类似的问题ListView shows empty message briefly before data is loaded
但这使用ListFragment 并派生自CursorAdapter,而我使用的是“普通”片段并且我的适配器派生自BaseAdapter。
我已经设置了一个空的textview在数据库中没有数据时显示,但是在加载数据时会短暂显示textview。
在我的片段中,我有这个代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
databaseManager = new DatabaseManager(getActivity());
progressDialog = new ProgressDialog(getActivity());
setHasOptionsMenu(true);
mContext = getActivity();
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.item_list_layout, container, false);
itemListView = (ListView) rootView.findViewById(R.id.itemListView);
emptyText = (TextView) rootView.findViewById(R.id.empty);
registerForContextMenu(itemListView);
itemListView.setClickable(true);
itemListView.setEmptyView(emptyText);
ActionBar actionBar = getActivity().getActionBar();
if (actionBar != null) {
actionBar.setTitle("Items");
}
new ItemListLoadAsync().execute();
return rootView;
}
在我的派生 BaseAdapter 类中,我有这个:
public class ItemViewAdapter extends BaseAdapter {
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater)
mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_list_row, null);
}
itemNameTextView = (TextView) convertView.findViewById(R.id.itemNameTextView);
descriptionTextView = (TextView) convertView.findViewById(R.id.descriptionTextView);
itemNameTextView.setText(items.get(position).getItemName());
descriptionTextView.setText(items.get(position).getItemDescription());
return convertView;
}
我该如何纠正这个问题?我是否为我的列表使用了“正确”的适配器?
【问题讨论】:
-
将
emptyTextview的可见性设置为Gone -
AFAIK 您正在使用自定义适配器。所以没有数据时不需要显示空视图。有一种方法:当您在 Textview 中设置文本时,您可以在 getView() 中放置一个条件,如果数据为空 setText("") else setText("yourData ”)。出现问题是因为您正在执行 itemListView.setEmptyView(emptyText);在调用 AsyncTask 之前!所以它会在每次将数据设置为 Adapter 之前显示 emptyView。
-
这是正确的(尽管可能不是有意的)行为。
ListFragment具有常规Fragment没有的一件事是方法setListShown(boolean)。很早就调用setListShown(false)是很常见的(在屏幕上显示视图之前),这会显示微调器而不是正常内容。然后在第一次加载后调用setListShown(true),此时您将看到一个列表或空视图。你可以做类似的事情;也许让空的 TextView 根本没有文本,然后在第一次加载完成后设置它的文本。 -
感谢@MDroid 和 Karakuri,我解决了
标签: android android-fragments android-listview