2013-05-06 13 views
40

Ho una lista che sta recuperando dati dal database sqlite di Json.listview dinamico aggiungendo "Carica più elementi" alla fine del scroll

Voglio trasformarlo in listview dinamico che alla fine dello scorrimento, un "carica più elementi" appare nel piè di pagina dell'elenco mentre si caricano più elementi e li si aggiunge all'adattatore (ad esempio 10 voci ogni volta) . Ho problemi nell'implementazione di questa funzione. Per favore aiutami con questo. Grazie.

public class AllProductsActivity extends Activity { 

... defining variables...; 

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

    new LoadAllProducts().execute(); 

} 

class LoadAllProducts extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     ... progress dialog... 
    } 

    protected String doInBackground(String... args) { 
     countryList = new ArrayList<Country>(); 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params); 

     Log.d("All Products: ", json.toString()); 

     try { 
      // Checking for SUCCESS TAG 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // products found 
       // Getting Array of Products 
       products = json.getJSONArray(TAG_PRODUCTS); 

       // looping through All Products 
       for (int i = 0; i < products.length(); i++) { 
        JSONObject c = products.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(TAG_PID); 
        String name = c.getString(TAG_NAME); 
        String description = c.getString(TAG_DESCRIPTION); 
        String due_date = c.getString(TAG_DUE_DATE); 
        String staff = c.getString(TAG_STAFF); 
        String status = c.getString(TAG_STATUS); 

        country = new Country(id,name,description, 
          due_date, staff, status); 
        countryList.add(country); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    protected void onPostExecute(String file_url) { 
     pDialog.dismiss(); 
     runOnUiThread(new Runnable() { 
      public void run() { 

       displayListView(); 

      } 
     }); 
    } 
} 

private void displayListView() { 
    dataAdapter = new MyCustomAdapter(this, 
      R.layout.country_info, countryList); 
    ListView listView = (ListView) findViewById(R.id.listView1); 
    listView.setAdapter(dataAdapter); 
} 

private class MyCustomAdapter extends ArrayAdapter<Country> { 

    ... blah blah blah ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder = null; 
     Log.v("ConvertView", String.valueOf(position)); 
     if (convertView == null) { 
     ... blah blah blah ... 
     } 

     return convertView; 
    } 
} 
} 

risposta

80

si tenta il seguente codice

list.setOnScrollListener(new OnScrollListener() { 

     public void onScrollStateChanged(AbsListView view, int scrollState) { 


     } 

     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 

      if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0) 
      { 
       if(flag_loading == false) 
       { 
        flag_loading = true; 
        additems(); 
       } 
      } 
     } 
    }); 

nel additem() aggiungere le 10 voci successive alla lista di array e impostare il flag_loading come false. e chiama notifydatasetchanged. dovrebbe funzionare.

+0

Devo definire 'prima item' visble,' visibile voce CONTO' e 'totalitemcount'? –

+0

no, non devi. –

+0

Devo definirli così: int first visible item = 1; int visibleitemcount = 10; int totalitemcount = 45; ? –

11

V'è la soluzione, l'attività è di implementare l'interfaccia AbsListView.OnScrollListener

in attività:

int currentFirstVisibleItem = 0; 
int currentVisibleItemCount = 0; 
int totalItemCount = 0; 
int currentScrollState = 0; 
boolean loadingMore = false; 
Long startIndex = 0L; 
Long offset = 10L; 
View footerView; 



@Override 
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    this.currentFirstVisibleItem = firstVisibleItem; 
    this.currentVisibleItemCount = visibleItemCount; 
    this.totalItemCount = totalItemCount; 
} 

@Override 
public void onScrollStateChanged(AbsListView absListView, int scrollState) { 
    this.currentScrollState = scrollState; 
    this.isScrollCompleted(); 
} 

private void isScrollCompleted() { 
    if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE && this.totalItemCount == (currentFirstVisibleItem + currentVisibleItemCount)) { 
     /*** In this way I detect if there's been a scroll which has completed ***/ 
     /*** do the work for load more date! ***/ 
     if (!loadingMore) { 
      loadingMore = true; 
      new LoadMoreItemsTask(this).execute(); 
     } 
    } 
} 



private class LoadMoreItemsTask extends AsyncTask<Void, Void, List<ListItem>> { 

    private Activity activity; 
    private View footer; 

    private LoadMoreItemsTask(Activity activity) { 
     this.activity = activity; 
     loadingMore = true; 
     footer = activity.getLayoutInflater().inflate(R.layout.base_list_item_loading_footer, null); 
    } 

    @Override 
    protected void onPreExecute() { 
     list.addFooterView(footer); 
     list.setAdapter(adapter); 
     super.onPreExecute(); 
    } 

    @Override 
    protected List<ListItem> doInBackground(Void... voids) { 

     return getNextItems(startIndex, offset); 
    } 

    @Override 
    protected void onPostExecute(List<ListItem> listItems) { 
     if (footer != null) { 
       list.removeFooterView(footer); 
     } 
     list.setAdapter(adapter); 

     loadingMore = false; 
     if (listItems.size() > 0) { 
      startIndex = startIndex + listItems.size(); 
      setItems(listItems); 
     } 
     super.onPostExecute(listItems); 
    } 


} 

OnCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.base_list); 
    list = (ListView) findViewById(R.id.list); 
    list.setOnItemClickListener(this); 
    list.setOnScrollListener(this); 


     footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.base_list_item_loading_footer, null, false); 



    initAdapter(); 


    new LoadMoreItemsTask(this).execute(); 

} 

base_list_item_loading_footer.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item_footer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:padding="15dp" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:orientation="horizontal" > 

     <ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 
     </ProgressBar> 

     <TextView 
      style="@style/ItemHeadTextStyle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="@string/loading_list_items" /> 
    </LinearLayout> 
</RelativeLayout> 

Spero che sia d'aiuto.

+0

Fornire la seguente funzione setItems(); –

7

modo migliore per attuare dinamica Expandaple LW con piè di pagina spiegato di seguito: implementazione

private int firstVisibleItem, visibleItemCount,totalItemCount; 

expandapleListView.setOnScrollListener(new AbsListView.OnScrollListener() { 

      @Override 
      public void onScroll(AbsListView view, 
           int firstVisibleItemm, int visibleItemCountt, 
           int totalItemCountt) { 
       firstVisibleItem = firstVisibleItemm; 
       visibleItemCount = visibleItemCountt; 
       totalItemCount = totalItemCountt; 


      } 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
       final int lastItem = firstVisibleItem + visibleItemCount; 
       if (lastItem == totalItemCount && scrollState == SCROLL_STATE_IDLE) { 
        expandapleInt++; 

        new AsyncTask().execute(); 

        //get next 10-20 items(your choice)items 

       } 
      } 
     }); 

piè di pagina:

Qui di seguito il codice XML, dovrebbe essere in fondo di layout che la ListView al suo interno ...

<RelativeLayout 
android:layout_width="match_parent" 
android:layout_height="45dp" 
android:layout_gravity="center" 
android:id="@+id/footer"> 

<ProgressBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_toLeftOf="@+id/textView3" 
    android:layout_toStartOf="@+id/textView3"> 
</ProgressBar> 

<TextView 

    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 

    android:text="Loading" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" 
    android:id="@+id/textView3" /> 

B ind nella vostra attività

footer = (RelativeLayout) findViewById(R.id.footer); 
footer.setVisibility(View.GONE); 

OnPreExecute

footer.setVisibility(View.VISIBLE); 

OnPostExecute

footer.setVisibility(View.GONE); 
Problemi correlati