如何使用自定义列表适配器显示listView为空

时间:2013-09-07 05:58:59

标签: android listview listadapter

我有一个列表适配器类,它填充了我的列表视图。但是如果我的列表由于某种原因是空的那么它只是空白。如何让它在列表中添加一个项目“list is empty”?

我可能会添加另一个项目,即为空项目制作不同的layotu文件,但我不确定如何使用两种类型的视图?

以下是我的列表适配器的当前代码:

public class MyOrdersAdapter extends BaseAdapter {

private GlobalObjects global;
private Context mContext;
private String TAG = "MyOrdersAdapter";

private boolean listIsEmpty = true;

// Keep all Objects in array
public ArrayList<MyOrdersItem> orders;

/**
 * Constructor for creating a menu category
 * 
 * @param c
 *            the context of the class calling this class
 * @param _global
 *            the reference to the global object
 */
public MyOrdersAdapter(Context c, GlobalObjects _global) {
    mContext = c;
    global = _global;
    orders = new ArrayList<MyOrdersItem>();
    listIsEmpty = true;


    JSONArray ordersObj = getCategoriesFromServer();
    if (ordersObj != null) {
        putOrdersIntoArray(ordersObj);
    } else {
        // Orders is null
        Log.e(TAG, " Orders is null, which means the server did not return anything");
    }
}

@Override
public int getCount() {
    return orders.size();
}

@Override
public Object getItem(int position) {
    return orders.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

public ArrayList<MyOrdersItem> getOrders() {
    return orders;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.my_order_item, null);
        holder = new ViewHolder();
        holder.imageView = (ImageView) convertView.findViewById(R.id.my_order_item_textView_img);
        holder.txtName = (TextView) convertView.findViewById(R.id.my_order_item_textView_name);
        holder.txtQuantity = (TextView) convertView.findViewById(R.id.my_order_item_textView_quantity);
        holder.txtPrice = (TextView) convertView.findViewById(R.id.my_order_item_textView_price);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    // Temp variable to store the current menu category item
    final MyOrdersItem orderItem = (MyOrdersItem) getItem(position);

    loadImgFromServer(orderItem.getProductId(), holder.imageView);
    holder.txtName.setText(orderItem.getName());
    holder.txtQuantity.setText(orderItem.getQuantity());
    holder.txtPrice.setText(orderItem.getPrice());

    convertView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "Deleting order in position : " + position);
            deleteOrder(orders.get(position));
            orders.remove(position);
        }
    });
    return convertView;
}

/**
 * Loads the related image from the server into the ImageView for the specific item
 */
private void loadImgFromServer(String id, ImageView img) {
    // Log.i(TAG, "Loading Image with product id: " + id);
    int width = 80;
    int height = 80;
    String url = global.getBaseUrl() + "client/product/image/" + id + "/" + width + "/" + height;
    UrlImageViewHelper.setUrlDrawable(img, url, R.drawable.loading_icon, global.getImageCacheTime());
    Log.i(TAG, " IMAGE URL: " + url);
}

/**
 * Private View holder class Keeps a reference to the View for the certain components.
 * Is used to increase performance of the listView
 */
private class ViewHolder {
    ImageView imageView;
    TextView txtName;
    TextView txtQuantity;
    TextView txtPrice;
}

/**
 * Parses the JSON object and builds an array of MenuCategories
 * 
 * @return
 */
private void putOrdersIntoArray(JSONArray categoryList) {
    try {
        for (int i = 0; i < categoryList.length(); i++) {

            JSONObject tmpObj = categoryList.getJSONObject(i);
            String id = tmpObj.getString("productId");
            String name = tmpObj.getString("productName");
            String quantity = tmpObj.getString("quantity");
            String price = tmpObj.getString("productPrice");

            MyOrdersItem tmpOrder = new MyOrdersItem(id, name, quantity, price);
            orders.add(tmpOrder);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

}

3 个答案:

答案 0 :(得分:6)

ListView对此调用setEmptyView有一个特殊功能,您无需更改适配器。 在布局中创建另一个TextView,并在列表为空时显示要显示的消息。

然后在你的活动中:

View empty = findViewById(R.id.empty);
ListView list=(ListView)findViewById(R.id.list);
list.setEmptyView(empty);

答案 1 :(得分:0)

在您的活动布局中再添加一个textview。如果您的列表为空,则将可见性设置为可见,否则消失,无需更改适配器中的任何内容

答案 2 :(得分:0)

试试这个:

您可以将TextView设置为空视图,以指示用户列表为空

<TextView
    android:id="@+id/empty_view"
    android:layout_width="match_parent"
    android:layout_height="60px"
    android:text="@string/empty_text" />

mListView.setEmptyView(findViewById(R.id.empty_view));

其中string empty_text 的值类似于“List is Empty”