1

スクロールボタンのリストビューの場合、より多くのデータを取得する方法。これは私のコードです:

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

ファイル DatabaseHandler.java 内のデータベースへの関数クエリ

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

Log.d("MyLog", "count: "+totalItems); を使用して logcat を表示した場合 最初にリストビューを表示するときに 10 に設定したため、count: 10を取得します。

私の質問は、データベースで+30行のデータまであるため、下にスクロールしたときにリストビューにさらにデータ行をロードする方法です。インターネットでチュートリアルを見ましたが、成功しませんでした。多分ここで、私の問題を解決しました。

ありがとう。

4

2 に答える 2

1

データベースを開いてから onScroll() で、データベースのクエリを終了して次の 10 項目を取得し、アダプターに追加して、 adapter で 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) {

}

  }

これが役立つと思います。

于 2013-01-08T14:24:24.263 に答える
0

データベースを開いてから、スクロールするたびに変更をデータベースに照会し、結果を必要な数に制限する必要があります。したがって、アプリを初めて開いたときに、たとえば10行をプルし、スクロール後にデータベースにクエリを実行して、次の10行をさらにプルします!!!

アップデート

もう少し簡単にしましょう!データ型で ArrayList を作成してください! プライベート int limitCounter = 0; を作成します。その後、データベースからすべてのデータを取得し、ArrayList に挿入します。次に、スクロールすると limitCounter の値が変更され、そこから適切なデータが取得されるため、毎回データベースにクエリを実行する必要がなくなります。

アップデート #2

次のチュートリアルをお試しください: http://www.androidhive.info/2012/03/android-listview-with-load-more-button/

于 2013-01-08T14:12:22.537 に答える