2013-01-08 14 views
0

如果滾動按鈕中的列表視圖,如何拉取更多數據。 這是我的代碼:文件DatabaseHandler.java從數據庫SQLite中拉取Moredata,在列表視圖中滾動底部

public NewsItem[] getItems(String category, int limit) { 
    // ask the content provider for the items 
    Uri uri = Uri.withAppendedPath(
      DatabaseProvider.CONTENT_URI_ITEMS_BY_CATEGORY, category); 
    String[] projection = new String[] { DatabaseHelper.COLUMN_ITEM_ID, 
      DatabaseHelper.COLUMN_ITEM_TITLE, 
      DatabaseHelper.COLUMN_ITEM_DESCRIPTION, 
      DatabaseHelper.COLUMN_ITEM_URL, 
      DatabaseHelper.COLUMN_ITEM_THUMBNAIL }; 
    String sortOrder = DatabaseHelper.RELATIONSHIP_TABLE + "." 
      + DatabaseHelper.COLUMN_RELATIONSHIP_PRIORITY + " ASC, " 
      + DatabaseHelper.ITEM_TABLE + "." 
      + DatabaseHelper.COLUMN_ITEM_PUBDATE + " DESC"; 
    Cursor cursor = contentResolver.query(uri, projection, null, null, 
      sortOrder); 

    // check the cursor isn't null 
    if (cursor == null) { 
     // bail here, returning an empty array 
     return new NewsItem[0]; 
    } 

    // load the column names 
    int id = cursor.getColumnIndex(DatabaseHelper.COLUMN_ITEM_ID); 
    int title = cursor.getColumnIndex(DatabaseHelper.COLUMN_ITEM_TITLE); 
    int description = cursor 
      .getColumnIndex(DatabaseHelper.COLUMN_ITEM_DESCRIPTION); 
    int url = cursor.getColumnIndex(DatabaseHelper.COLUMN_ITEM_URL); 
    int thumbnail = cursor 
      .getColumnIndex(DatabaseHelper.COLUMN_ITEM_THUMBNAIL); 

    // load the items into an array 
    ArrayList<NewsItem> items = new ArrayList<NewsItem>(); 

    while (cursor.moveToNext() && cursor.getPosition() < limit) { 
     NewsItem item = new NewsItem(); // initialize a new item 
     item.setId(cursor.getInt(id)); 
     item.setTitle(cursor.getString(title)); 
     item.setDescription(cursor.getString(description)); 
     item.setUrl(cursor.getString(url)); 
     item.setThumbnailBytes(cursor.getBlob(thumbnail)); 
     items.add(item); // add this item to the array 
    } 

    cursor.close(); 

    return items.toArray(new NewsItem[items.size()]); 
} 

DatabaseHandler database; 
ListView mylist; 

ArrayList<NewsItem> items; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.category, container, false); 

     mylist = (ListView) view.findViewById(R.id.categoryNewsItemGrid); 

     mylist.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // retrieve the NewsItem at the index of the click 
       NewsItem item = (NewsItem) mylist.getAdapter().getItem(position); 
       // view the item 
       clickHandler.onItemClick(item.getId()); 
      } 
     }); 


     mylist.setOnScrollListener(new OnScrollListener() { 
      public void onScrollStateChanged(AbsListView list, int state) { 
       if (state == OnScrollListener.SCROLL_STATE_IDLE) { 
       // check to see if all the visible items have images 
       int firstVisible = list.getFirstVisiblePosition(); 
       int lastVisible = list.getLastVisiblePosition(); 
       for (int i = firstVisible; i <= lastVisible; i++) { 
        NewsItem item = (NewsItem) list.getAdapter().getItem(i); 
        // if this item doesn't have a thumbnail 
        if (item.getThumbnailBytes() == null) { 
         // load the thumbnail 
         Bundle bundle = new Bundle(); 
         bundle.putInt(ResourceService.KEY_ITEM_ID, 
           item.getId()); 
         service.sendMessageToService(
           ResourceService.MSG_LOAD_THUMB, bundle); 
        } 
       } 
      } 
      } 

      public void onScroll(AbsListView list, int firstVisible, 
        int visibleItems, int totalItems) { 
       if (visibleItems != 0 
         && ((firstVisible + visibleItems) >= (totalItems))) { 

        Log.d("MyLog", "count: "+totalItems); 

       } 
      } 
     }); 
     displayCategory(getArguments().getString("category")); 

     return view; 
} 

public void displayCategory(String categoryTitle) { 

    items = new ArrayList<NewsItem>(Arrays.asList(database.getItems(
      categoryTitle, 10))); 
    mylist.setAdapter(new ItemAdapter(getActivity(), R.layout.list_news_item, 
      items, 70, 70)); 
} 

功能查詢數據庫。如果我與Log.d logcat中看到( 「MyLog」, 「算:」 + TOTALITEMS) ; 我得到count:10,因爲我第一次顯示listview時將它設置爲10。

我的問題,如何在列表視圖中加載更多的數據行,當我滾動底部,因爲在數據庫我有+30行數據。我看到互聯網上的教程,但沒有成功。也許在這裏,解決了我的問題。

謝謝。

回答

0

你必須打開你的數據庫,然後在每個滾動規定的變化查詢數據庫和限制你的結果到你想要的數量!所以,第一次打開你的應用程序時,你會拉動,讓我們說10行,然後在滾動後,你將查詢數據庫,並拉動下10行!

更新

讓我們使它更容易一些!用你的數據類型創建一個ArrayList!並使一個私人int limitCounter = 0 ;.之後,從數據庫獲取所有數據並將其插入ArrayList。然後,當您滾動時,您將更改limitCounter的值並從中提取適當的數據,這樣您就不必每次都查詢數據庫。

更新#2

嘗試下面的教程它會幫助你:http://www.androidhive.info/2012/03/android-listview-with-load-more-button/

+0

嗨,感謝您的回覆,是的,我知道這個邏輯,但如何編碼實現它 –

+0

檢查我添加的教程! – Pavlos

1

你要打開你的數據庫,然後在onScroll(),如果你達到最終查詢數據庫獲取下一個10項並追加到適配器並在適配器上調用notifyDataSetChanged()。所以第一次打開你的應用程序時,你會拉動,比方說10行,然後在滾動之後,你將查詢數據庫,並拉動下10行。請檢查下面的示例代碼。

public class GrowingListViewActivity extends ListActivity implements OnScrollListener { 
Aleph0 adapter = new Aleph0(); 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setListAdapter(adapter); 
    getListView().setOnScrollListener(this); 
} 

public void onScroll(AbsListView view, int firstVisible, int visibleCount, 
     int totalCount) { 

    boolean loadMore = /* maybe add a padding */ 
    firstVisible + visibleCount >= totalCount; 

    if (loadMore) { 
     adapter.count += visibleCount; // or any other amount 
     adapter.notifyDataSetChanged(); 
    } 
} 

public void onScrollStateChanged(AbsListView v, int s) { 
} 

class Aleph0 extends BaseAdapter { 

    int count = 40; /* starting amount */ 

    public int getCount() { 
     return count; 
    } 

    public Object getItem(int pos) { 
     return pos; 
    } 

    public long getItemId(int pos) { 
     return pos; 
    } 

    public View getView(int pos, View v, ViewGroup p) { 
     TextView view = new TextView(GrowingListViewActivity.this); 
     view.setText("entry View : " + pos); 
     return view; 
    } 
} 
} 


    public class CustomArrayAdapter extends ArrayAdapter implements 
    OnScrollListener { 
private final Context context; 
private final ArrayList<String> values; 

static class ViewHolder { 
    public TextView text; 
    public ImageView image; 
} 

public CustomArrayAdapter(Context arg0, int arg1, int arg2, 
     ArrayList<String> arg3) { 
    super(arg0, arg1, arg2, arg3); 
    this.context = arg0; 
    this.values = arg3; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int product_id = 0; 
    View rowView = new View(context); 
    try { 

     ImageView wic_logo = new ImageView(context); 
     TextView label = new TextView(context); 

     String p = values.get(position); 

     label.setText(p); 

     wic_logo.setImageResource(R.drawable.ic_launcher); 

     Log.d("Custom Array Adapter", "at" + position); 
    } catch (Exception e) { 
     Log.d("Custom Array Adapter", "catch"); 
    } 

    return rowView; 
} 

public void onScroll(AbsListView arg0, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 
    Log.d("entered onScroll", " " + firstVisibleItem + visibleItemCount 
      + totalItemCount); 
    if (((firstVisibleItem + visibleItemCount) >= totalItemCount - 1)) { 
     Log.d("entered if", " " + firstVisibleItem + visibleItemCount 
       + totalItemCount); 
     // if we're at the bottom of the listview, load more data 
     addData(totalItemCount, totalItemCount); // values.get(totalItemCount)); 
    } 
} 

private void addData(int totalItemCount, int productId) { 

    Toast.makeText(getContext(), "last item", Toast.LENGTH_SHORT).show(); 
} 

public void onScrollStateChanged(AbsListView arg0, int arg1) { 

} 

    } 

我想這會幫助你。

+0

對不起,我的代碼實施與您的解決方案太長, –

相關問題