【问题标题】:Empty Listview Text shows for a few seconds before listview loads空列表视图文本在加载列表视图之前显示几秒钟
【发布时间】: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


【解决方案1】:

您可以稍后调用 setEmptyView() 来确定是否有要加载的数据。

【讨论】:

  • 此行也可以作为评论添加!发布此类答案时请小心
  • 为什么,这是一个可以解决他问题的答案?这不是我们在这里所做的吗?
  • AFAIK 这不是给出答案的正确方法。我不会对此投反对票,但可能有人会这样做!
  • 所以你不知道给出答案的正确方法,但你告诉我我做错了......老实说,我不知道如何回复。
  • @MDroid FWIW,我会接受您的评论并将其作为答案。您可能仍需要使用 cmets 要求进一步澄清,但我会说无论长度如何,答案都是答案。答案足够短以适合评论的事实并不需要它。
【解决方案2】:

根据@MDroid 的评论,我删除了该行:

itemListView.setEmptyView(emptyText);

然后在我的ItemListAsyncTask 的 onPostExecute() 方法中,我这样做了:

public void onPostExecute(List<Item> items) {
        long delayInMillis = 500;
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                progressDialog.dismiss();
            }
        }, delayInMillis);


        if(items.size() == 0) {
            itemListView.setEmptyView(emptyText);
        } else {
            ItemViewAdapter = new ItemViewAdapter(mContext, items);
            itemListView.setAdapter(itemViewAdapter);
        }

    }

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多