2013-09-07 15 views
5

Ho una classe di list adapter che mi riempie di vista elenco. Ma se la mia lista è vuota per qualche motivo è solo vuota. Come posso aggiungere un elemento all'elenco dicendo "la lista è vuota"?Come mostrare che un listView è vuoto con un adattatore di lista personalizzato

Avevo in mente di aggiungere un altro elemento, ovvero creare un file di layotu diverso per l'elemento vuoto, ma non sono sicuro di come utilizzare due tipi di visualizzazioni?

Ecco il codice attualmente per il mio adattatore lista:

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

}

risposta

6

ListView ha una funzione speciale per questo chiamato setEmptyView, non è necessario cambiare l'adattatore. Crea un altro TextView nel tuo layout con il messaggio che vuoi mostrare quando l'elenco è vuoto.

Poi, nel tuo attività:

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

Grazie per un ottima e semplice soluzione. Funziona perfettamente. Veloce e facile da implementare. – Zapnologica

0

nel layout attività aggiungere un altro TextView. e se la tua lista è vuota allora imposta la visibilità visibile altrimenti non c'è bisogno di cambiare nulla nell'adattatore

0

Prova questo:

È possibile impostare TextView come una vista vuoto per indicare all'utente che lista è vuota

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

Dove stringa empty_text ha un valore come "Elenco è vuoto"

Problemi correlati