2013-09-07 4 views
5

Ich habe eine Liste Adapter-Klasse, die mich Listenansicht füllt. Aber wenn meine Liste aus irgendeinem Grund leer ist, ist sie einfach leer. Wie kann ich ein Element zur Liste hinzufügen, dass "Liste ist leer"?So zeigen Sie, dass eine ListView leer ist mit einem benutzerdefinierten Listenadapter

Ich wollte vielleicht ein anderes Element hinzufügen, zB eine andere Layotu-Datei für das leere Objekt erstellen. Aber ich bin mir nicht sicher, wie ich zwei Arten von Ansichten verwenden soll? Hier

ist der Code zur Zeit für meine Liste Adapter:

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(); 
    } 
} 

}

Antwort

6

ListView hat eine spezielle Funktion namens setEmptyView, Sie müssen Ihren Adapter nicht ändern. Erstellen Sie eine weitere TextView in Ihrem Layout mit der Nachricht, die angezeigt werden soll, wenn die Liste leer ist.

Dann in Ihrer Aktivität:

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

Danke für eine großartige und einfache Lösung. Funktioniert perfekt. Schnell und einfach zu implementieren. – Zapnologica

0

In Ihrer Tätigkeit Layout eine weitere Textview hinzuzufügen. und wenn Ihre Liste leer ist, dann setzen Sie die Sichtbarkeit sichtbar sonst ist es nicht nötig, etwas in Ihrem Adapter zu ändern

0

Try this:

Sie Textview als eine leere Ansicht festlegen können Benutzer anzuzeigen, dass Liste leer ist

<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)); 

Wo String empty_text hat einen Wert wie "Liste ist leer"

Verwandte Themen