2013-05-06 7 views
40

Mam listview, który pobiera dane z bazy danych sqlite przez Json.dynamiczny podgląd listy dodawanie "Załaduj więcej elementów" na końcu przewijania

Chcę zamienić go w dynamiczny podgląd list, który na końcu przewijania, "załaduj więcej elementów" pojawi się w stopce listy podczas ładowania kolejnych elementów i dodawania ich do adaptera (na przykład 10 pozycji za każdym razem) . Mam problem z implementacją tej funkcji. Proszę, pomóż mi z tym. Dzięki.

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

Odpowiedz

80

spróbować następujący kod

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

w additem() dodać kolejne 10 pozycji do listy tablicy i ustaw flag_loading jak false. i zadzwoń pod numer notifydatasetchanged. to powinno działać.

+0

powinienem zdefiniować 'pierwszy visble item',' widoczny element count' i 'totalitemcount'? –

+0

nie, nie musisz. –

+0

Należy zdefiniować je tak: int pierwszy widoczny element = 1; int visibleitemcount = 10; int totalitemcount = 45; ? –

11

nie jest rozwiązaniem, aktywny musi realizować interfejs AbsListView.OnScrollListener

W aktywność:

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> 

Mam nadzieję, że pomoże.

+0

Proszę podać następującą funkcję setItems(); –

7

Najlepszy sposób wdrożyć Dynamiczne Expandaple LW z stopce poniżej: wdrożenie

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 

       } 
      } 
     }); 

Stopka:

Poniżej kodu xml, powinny znajdować się w dolnej części układu, który swoim ListView wewnątrz niego ...

<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 go w swojej działalności

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

onPreExecute

footer.setVisibility(View.VISIBLE); 

onPostExecute

footer.setVisibility(View.GONE); 
Powiązane problemy