0

我正在使用 SimpleCursorAdapter 填充 ListView

@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {

    String[] projection = new String[] { BlogTable.TITLE_PLAIN, BlogTable.DATE_MODIFIED, BlogTable.EXCERPT, BlogTable.ID };

    CursorLoader loader = new CursorLoader(parent, BlogContentProvider.CONTENT_URI, projection, null, null, BlogTable.DATE_MODIFIED + " DESC LIMIT " + BlogContentProvider.QUERY_LIMIT);

    return loader;
}

private void fillData(){

    //_id is expected from this method that is why we used it earlier
    String[] from = new String[] { BlogTable.TITLE_PLAIN, BlogTable.DATE_MODIFIED, BlogTable.EXCERPT};
    int[] to = new int[] { R.id.text_news_title, R.id.text_news_date, R.id.text_news_excerpt};

    //initialize loader to call this class with a callback
    getLoaderManager().initLoader(0, null, this);

    //We create adapter to fill list with data, but we don't provide any data as it will be done by loader
    adapter = new SimpleCursorAdapter(parent, R.layout.news_list_view, null, from, to, 0);

    setListAdapter(adapter);
}

我想一次只加载 10 个项目,然后在列表的末尾调用一个方法 addData() 并再获得 10 行,依此类推。我知道为此有 CWAC EndlessAdapter,但是我不知道要向当前 ListView 添加另外 10 行并同时保持位置的调用。

我知道这听起来像是一个愚蠢的问题,但我对 Android 开发还比较陌生,而且还在学习。任何人都可以帮忙吗?

编辑:

这是我正在使用的 ContentProvider,也许它可以提供帮助

package com.brndwgn.database;

import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;

public class BlogContentProvider extends ContentProvider {


    private DbHelper dbh;

    //identifiers for URI types
    public static final int BLOG_LIST = 1;
    public static final int BLOG_ITEM = 2;

    //elements of our URI to identify our COntentProvider
    public static final String AUTHORITY = "com.brndwgn.database";
    public static final String BASE_PATH = "blog";


    //URI to query from this Content provider
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);


    //MIME data types we offer
    public static final String BLOG_LIST_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/bloglist";
    public static final String BLOG_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/blogitem";

    public static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    //patterns for our provider
    static {
        matcher.addURI(AUTHORITY, BASE_PATH, BLOG_LIST);
        matcher.addURI(AUTHORITY, BASE_PATH + "/#", BLOG_ITEM);
    }

    public static final int QUERY_LIMIT = 2;

    @Override
    public boolean onCreate() {
        dbh = new DbHelper(getContext());
        return true;
    }

    @Override
    public String getType(Uri uri) {
        int uriId = matcher.match(uri);
        //we check id of URI and return correct MIME type, we defined all of them before
        switch(uriId) {
        case BLOG_ITEM: return BLOG_ITEM_TYPE;
        case BLOG_LIST: return BLOG_LIST_TYPE;
        default:
            throw new IllegalArgumentException("Unknown uri: " + uri);
        }
    }   

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        int uriId = matcher.match(uri);

        //we create object of SQL query builder so we don't need to use plain SQL
        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();

        //Set a name for the table to query
        builder.setTables(BlogTable.TABLE_NAME);

        switch(uriId) {
        case BLOG_ITEM: 
            //set where condition to get just one row
            builder.appendWhere(BlogTable.ID + "=" + uri.getLastPathSegment());
            break;
        case BLOG_LIST:
            //we don't need to do anything here
            break;
        default:
            new IllegalArgumentException("Unknown uri: " + uri);
        }

        //get instance of database
        SQLiteDatabase db = dbh.getReadableDatabase();

        //execute query
        Cursor cursor = builder.query(db, projection, selection, selectionArgs, null, null, sortOrder);

        //set notifications for this URI
        cursor.setNotificationUri(getContext().getContentResolver(), uri);

        return cursor;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int uriId = matcher.match(uri);

        int deleted=0;

        SQLiteDatabase db = dbh.getWritableDatabase();
        switch(uriId) {
        case BLOG_LIST:
            deleted = db.delete(BlogTable.TABLE_NAME, selection, selectionArgs);
            break;
        case BLOG_ITEM:
            if(TextUtils.isEmpty(selection)) {
                deleted = db.delete(BlogTable.TABLE_NAME, BlogTable.ID + "=" + uri.getLastPathSegment(), selectionArgs);
            }
            else {
                deleted = db.delete(BlogTable.TABLE_NAME, selection + " and " + BlogTable.ID + "=" + uri.getLastPathSegment(), selectionArgs);
            }
            break;
        default:
            throw new IllegalArgumentException("Unknow uri: " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return deleted;
    }


    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int uriId = matcher.match(uri);

        //Variable for ID of new record
        long newId;

        switch(uriId) {
        case BLOG_LIST:
            //get instance of Database
            SQLiteDatabase db = dbh.getWritableDatabase();

            //execute query
            newId = db.replace(BlogTable.TABLE_NAME, null, values);
            //newId = db.insertWithOnConflict(BlogTable.TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE);

            //create URI for new added record
            Uri newuri = Uri.parse(CONTENT_URI + "/" + newId);

            //notify change for list URI
            getContext().getContentResolver().notifyChange(uri, null);

            return newuri;

        default:
            throw new IllegalArgumentException("Unknown uri: " + uri);
        }


    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {

        int uriId = matcher.match(uri);

        int updated=0;

        SQLiteDatabase db = dbh.getWritableDatabase();

        switch(uriId) {
        case BLOG_LIST:
            updated = db.update(BlogTable.TABLE_NAME, values, selection, selectionArgs);
            break;
        case BLOG_ITEM:
            if(TextUtils.isEmpty(selection)) {
                updated = db.update(BlogTable.TABLE_NAME, values, BlogTable.ID + "=" + uri.getLastPathSegment(), null);
            }
            else {
                updated = db.update(BlogTable.TABLE_NAME, values, selection + " and " + BlogTable.ID + "=" + uri.getLastPathSegment(), selectionArgs);
            }
            break;
        default:
            throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return updated;
    }

}
4

1 回答 1

0

利用

adapter.notifyDataSetChanged();

adapterSimpleCursorAdapter的列表视图在哪里

编辑:

在此之前,您应该将数据添加到您的适配器。为此,请为您的适配器添加一个从数据库查询的方法。

于 2012-11-06T09:01:35.313 回答