ListActivity不会随着数据到达而更新

比尔·林奇

我正在构建一个小型应用程序,当新数据到达时,我想自动更新。

从我阅读的android文档中,我认为是因为我正在使用较新的技术,因此会在后台为我创建一个ContentObserver,而我只会自动调用Loader。

如果还有更多有用的信息,我很乐意添加它,或者将完整的项目上传到某个地方。

此外,我的目标是KitKat(SDK版本19)。

应用概述

  1. 我们有一个使用内置ListView的ListActivity。
  2. ListActivity通过使用Loader和SimpleCursorAdapter获取数据。
  3. 加载程序通过查询ContentProvider检索其数据。
  4. ContentProvider由SQLite数据库支持。

此外,在操作栏中,我添加了两个操作,一个添加一个项目,一个清除所有项目。

在添加项目时,不会使用新条目更新ListView,并且我还可以看到没有在ContentProvider上运行新查询。如果我关闭该应用程序,然后重新启动,则这些条目现在在ListView中可见。

源代码如下

Activity.java

package us.lynch.listdemo;

import java.text.DateFormat;
import java.util.Date;

import us.lynch.listdemo.R;
import android.app.ListActivity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.CursorAdapter;
import android.widget.SimpleCursorAdapter;

public class Activity extends ListActivity implements LoaderCallbacks<Cursor> {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new SimpleCursorAdapter(this, R.layout.listitem, null, new String[] { "string" }, new int[] { R.id.text }, 0));
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        ContentValues values = new ContentValues();

        switch (item.getItemId()) {
            case R.id.action_add:
                values.put("string", DateFormat.getDateTimeInstance().format(new Date()));
                getContentResolver().insert(Uri.parse("content://us.lynch.listdemo/data"), values);
                return true;

            case R.id.action_clear:
                getContentResolver().delete(Uri.parse("content://us.lynch.listdemo/data"), null, null);
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        Uri uri = Uri.parse("content://us.lynch.listdemo/data");
        String[] projection = { "_id", "string" };
        return new CursorLoader(this, uri, projection, null, null, "_id");
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        ((CursorAdapter) getListAdapter()).swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        ((CursorAdapter) getListAdapter()).swapCursor(null);
    }
}

ContentProvider.java

package us.lynch.listdemo;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.text.TextUtils;

public class ContentProvider extends android.content.ContentProvider {
    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    private Database mDatabase;

    private static final int MATCH = 1;
    private static final int MATCH_ID = 2;

    static {
        sUriMatcher.addURI("us.lynch.listdemo", "data", MATCH);
        sUriMatcher.addURI("us.lynch.listdemo", "data/#", MATCH_ID);
    }

    @Override
    public boolean onCreate() {
        mDatabase = new Database(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        switch (sUriMatcher.match(uri)) {
            case MATCH:
                return database().query("data", projection, selection, selectionArgs, null, null, sortOrder);
            case MATCH_ID:
                selection = addIdToSelection(uri, selection);
                return database().query("data", projection, selection, selectionArgs, null, null, sortOrder);
            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        switch (sUriMatcher.match(uri)) {
            case MATCH: {
                return ContentUris.withAppendedId(uri, database().insertOrThrow("data", null, values));
            }
            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        switch (sUriMatcher.match(uri)) {
            case MATCH:
                return database().delete("data", selection, selectionArgs);
            case MATCH_ID:
                selection = addIdToSelection(uri, selection);
                return database().delete("data", selection, selectionArgs);
            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        switch (sUriMatcher.match(uri)) {
            case MATCH:
                return database().update("data", values, selection, selectionArgs);
            case MATCH_ID:
                selection = addIdToSelection(uri, selection);
                return database().update("data", values, selection, selectionArgs);
            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

    @Override
    public String getType(Uri uri) {
        throw new IllegalArgumentException("Unknown URI " + uri);
    }

    private SQLiteDatabase database() {
        return mDatabase.getWritableDatabase();
    }

    private static String addIdToSelection(Uri uri, String selection) {
        return DatabaseUtils.concatenateWhere(selection, "_id = " + Long.toString(ContentUris.parseId(uri)));
    }
}

class Database extends SQLiteOpenHelper {
    Database(Context context) {
        super(context, "database", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        final String[] columns = new String[] {
                "_id integer primary key autoincrement",
                "string text not null",
        };

        database.execSQL("create table data (" + TextUtils.join(",", columns) + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        assert (false);
    }
}

RES /布局/ listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

RES /菜单/ main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_clear"
        android:title="Clear Items"
        android:visible="true">
    </item>
    <item
        android:id="@+id/action_add"
        android:title="Add Item"
        android:visible="true">
    </item>

</menu>
吉尔·韦利亚奇

您不使用Uri通知机制。

在query()方法中编写:

Cursor cursor = database().query("data", projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;

在修改内容(插入,更新,删除)的方法中,通知同一Uri:

ContentResolver cr = getContext().getContentResolver();
cr.notifyChange(uri, null);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

角度图不会随着数据更改而更新

来自分类Dev

Ng-repeat不会随着数组更改而更新

来自分类Dev

Excel条件格式会随着数据透视表而扩展?

来自分类Dev

Excel条件格式会随着数据透视表而扩展?

来自分类Dev

随着数据库的增长,插入随着时间的推移会变慢(无索引)

来自分类Dev

HTML对象标签的“数据”属性不会随着jQuery的更改而更新

来自分类Dev

编码滑块以随着数量的变化更新每单位价格

来自分类Dev

随着数据的增加,在 Solr 中提取的行数是否受到限制?

来自分类Dev

排序算法的性能如何随着数据中重复元素的变化而变化

来自分类Dev

随着数据的增加和动态排序自动填充公式

来自分类Dev

自定义UITableView单元格中的UILabel不会随着核心数据的更改而更新

来自分类Dev

视图不会随着更改viewModel而更新

来自分类Dev

反应| DataGrid不会随着状态更改而更新

来自分类Dev

使用Cypher的FOREACH将节点数组插入Neo4j会随着数据添加而变慢

来自分类Dev

随着数据处理并将其添加到图表中,“实时图表”图的刷新速度变慢WPF c#

来自分类Dev

如何修复React Router组件不会随着路由更改而更新

来自分类Dev

UITextView中的值不会随着用户输入而更新

来自分类Dev

DataGrid分组不会随着CollectionViewSource中的更改而更新

来自分类Dev

表视图布局不会随着设备方向的变化而更新

来自分类Dev

React Native 组件不会随着状态变化而更新

来自分类Dev

Vue:数据不会随着Vuex getter改变吗?

来自分类Dev

ImportHTML不会更新数据

来自分类Dev

学生数据不会更新

来自分类Dev

Python UDP数据包永远不会到达

来自分类Dev

Python UDP数据包永远不会到达

来自分类Dev

UILabel似乎不随着时间数据的变化而更新

来自分类Dev

如何固定低延迟内核,以便apt不会随着更新的通用内核而更新?

来自分类Dev

如何固定低延迟内核,以便apt不会随着更新的通用内核而更新?

来自分类Dev

为什么矢量化会随着数量的增加而失败,但是Map and Apply起作用?

Related 相关文章

  1. 1

    角度图不会随着数据更改而更新

  2. 2

    Ng-repeat不会随着数组更改而更新

  3. 3

    Excel条件格式会随着数据透视表而扩展?

  4. 4

    Excel条件格式会随着数据透视表而扩展?

  5. 5

    随着数据库的增长,插入随着时间的推移会变慢(无索引)

  6. 6

    HTML对象标签的“数据”属性不会随着jQuery的更改而更新

  7. 7

    编码滑块以随着数量的变化更新每单位价格

  8. 8

    随着数据的增加,在 Solr 中提取的行数是否受到限制?

  9. 9

    排序算法的性能如何随着数据中重复元素的变化而变化

  10. 10

    随着数据的增加和动态排序自动填充公式

  11. 11

    自定义UITableView单元格中的UILabel不会随着核心数据的更改而更新

  12. 12

    视图不会随着更改viewModel而更新

  13. 13

    反应| DataGrid不会随着状态更改而更新

  14. 14

    使用Cypher的FOREACH将节点数组插入Neo4j会随着数据添加而变慢

  15. 15

    随着数据处理并将其添加到图表中,“实时图表”图的刷新速度变慢WPF c#

  16. 16

    如何修复React Router组件不会随着路由更改而更新

  17. 17

    UITextView中的值不会随着用户输入而更新

  18. 18

    DataGrid分组不会随着CollectionViewSource中的更改而更新

  19. 19

    表视图布局不会随着设备方向的变化而更新

  20. 20

    React Native 组件不会随着状态变化而更新

  21. 21

    Vue:数据不会随着Vuex getter改变吗?

  22. 22

    ImportHTML不会更新数据

  23. 23

    学生数据不会更新

  24. 24

    Python UDP数据包永远不会到达

  25. 25

    Python UDP数据包永远不会到达

  26. 26

    UILabel似乎不随着时间数据的变化而更新

  27. 27

    如何固定低延迟内核,以便apt不会随着更新的通用内核而更新?

  28. 28

    如何固定低延迟内核,以便apt不会随着更新的通用内核而更新?

  29. 29

    为什么矢量化会随着数量的增加而失败,但是Map and Apply起作用?

热门标签

归档