java - 调用了 BaseAdapter notifyDatasetChanged() 但从未调用过 getView()

标签 java android

我有一个自定义适配器,可以可视化订单列表中的每一行。

public class OrderRowAdapter extends BaseAdapter implements OnClickListener {
    OrderList items_;
    LayoutInflater inflater_;
    int list_view_resource_id_;
    private final String TAG = "OrderRowAdapter";

    public OrderRowAdapter(Context context, int list_view_resource_id,
            OrderList items) {
        this.list_view_resource_id_ = list_view_resource_id;
        this.items_ = items;
        this.inflater_ = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public Object getItem(int position) {
        return items_.getOrders(position);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        Log.d(TAG, "View updated for item in position = " + position);

        View v = convertView;
        if (v == null) {
            v = inflater_.inflate(list_view_resource_id_, parent);
        }

        Order item = items_.getOrders(position);
        if (item != null) {
            TextView order_info_tv = (TextView) v.findViewById(R.id.order_info);
            TextView order_status_tv = (TextView) v.findViewById(R.id.order_status);

            if (order_info_tv != null) {
                order_info_tv.setText(
                        String.format("For customer: %s\nTotal of %d items", item.getCustomerId(), item.getItemsCount()));
            }
            if (order_status_tv != null) {
                order_status_tv.setText("Status: " + getStatusText(item.getStatus()));
            }
        }
        return v;
    }

    public int getCount() {
        if (items_ == null) {
            Log.d(TAG, "Null so get count returned 0");
            return 0;
        } else {
            Log.d(TAG, "Get count returned " + items_.getOrdersCount());
            return items_.getOrdersCount();
        }
    };

从 Web 服务查询新的订单列表后,我想更新 ListView 的内容,所以我让我的 Activity 在调用 notifyDataSetChanged() 之前进行更新

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.orders);

    initThreading();
    findViews();
    setUrls();

    // Load the list of order from disk
    try {
        order_list_ = OrderList.parseFrom(new FileInputStream(
                "/sdcard/orderList.bin"));
    } catch (FileNotFoundException e) {
        Log.e(TAG, "Cannot find the file", e);
    } catch (IOException e) {
        Log.e(TAG, "Cannot read the file", e);
    }

    order_row_adapter_ = new OrderRowAdapter(OrderActivity.this,
            R.layout.order_row, order_list_);
    orders_listview_.setAdapter(order_row_adapter_);

    // Request new updates from the server
    updateOrderInformation(-1);
}

public void updateOrders(InputStream new_order_stream) {
    Log.d(TAG, "Updating order UI");
    try {
        order_list_.parseFrom(new_order_stream);
    } catch (IOException e) {
        Log.e(TAG, "IOException" , e);
    }

    runOnUiThread(new Runnable() {
        public void run() {
            guiUpdateOrders();
        }
    });
}

private void guiUpdateOrders() {
    order_row_adapter_.notifyDataSetChanged();
    Log.d(TAG, "Dataset notified that it has changed. GUI update anytime now.");
}

但是,从未调用 OrderRowAdapter 的 getView() 方法。 ListView 永远不会更新。

最佳答案

事实证明,我的 getView() 没有被调用的问题是因为它不可见。我的布局 xml 具有上部 TextViewfill_parent 的高度。因此整个 View 只有一个 TextView 可见。

解决方案:检查有问题的布局的图形 View ,确保 ListView 可见。

关于java - 调用了 BaseAdapter notifyDatasetChanged() 但从未调用过 getView(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8394124/

相关文章:

java - 不熟悉的java语法的数独算法

java - WebClientreactor.core.Exceptions$ErrorCallbackNotImplemented

android - 用 onCreate() 替换 android 构造函数

java - 主要 Activity 上的 Android 登录框

android - 如何使用 Koush AndroidAsync 关闭/重试/管理 WebSocket?

java - 如何使用java流从网络获取PDF文件

java - Hibernate (lucene) 搜索中的 And 运算符

java - Hibernate 延迟加载不适用于多对一映射

Android NDK 构建 - 包括 LOCAL_SHARED_LIBRARIES?

android - 如何在 Android fragment 中禁用屏幕捕获?