2013-05-06 29 views
40

Tôi có một listview đang tìm nạp dữ liệu từ cơ sở dữ liệu sqlite bởi Json.xem danh sách động thêm "Tải thêm mục" vào cuối cuộn

Tôi muốn biến nó thành chế độ xem danh sách động ở cuối cuộn, "tải thêm mục" xuất hiện trong chân của danh sách trong khi tải thêm mục và thêm chúng vào bộ điều hợp (ví dụ 10 mục mỗi lần) . Tôi gặp sự cố khi triển khai tính năng này. Xin hãy giúp tôi với nó. Cảm ơn.

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

Trả lời

80

bạn thử đoạn mã sau

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

trong additem() thêm 10 mặt hàng bên cạnh danh sách mảng và thiết lập các flag_loading như false. và gọi notifydatasetchanged. nó sẽ hoạt động.

+0

Tôi có nên xác định 'item' đầu tiên visble, 'mục count' nhìn thấy và' totalitemcount'? –

+0

không, bạn không cần phải làm như vậy. –

+0

Tôi có nên định nghĩa chúng như thế này không: int first visible item = 1; int visibleitemcount = 10; int totalitemcount = 45; ? –

11

Có sự là giải pháp, Hoạt động phải thực hiện giao diện AbsListView.OnScrollListener

Trong Hoạt động:

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> 

Tôi hy vọng điều đó sẽ hữu ích.

+0

Vui lòng cung cấp các hàm setItems sau(); –

7

Cách tốt nhất để thực hiện động Expandaple LW với chân giải thích dưới đây: thực hiện

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 

       } 
      } 
     }); 

Footer:

Đưa ra dưới đây đang xml, phải ở trong đáy Layout rằng ListView của bạn bên trong nó ...

<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 nó trong hoạt động của bạn

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

onPreExecute

footer.setVisibility(View.VISIBLE); 

onPostExecute

footer.setVisibility(View.GONE); 
Các vấn đề liên quan