Android: notifyDataSetChanged вызывается, но ListView не обновляется - PullRequest
3 голосов
/ 26 мая 2011

Я получил этот ListView, который заполняется из данных JSON в Интернете. Но когда я обновил запись JSON, например, добавив новую запись, ListView не обновился. Он не показывает новую запись в списке событий, хотя я уже вызвал notifyDataSetChanged ().

Кто-нибудь может мне помочь? Спасибо.

Вот мой код:

public class ProjectsList extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.projects_list);
        Intent serviceIntent = new Intent(this, LooserSync.class);
        startService(serviceIntent);
        ListView listView = (ListView) findViewById(R.id.lstText);
        MySimpleCursorAdapter projectAdapter = new MySimpleCursorAdapter(this, R.layout.listitems,
                managedQuery(Uri.withAppendedPath(LooserProvider.CONTENT_URI,
                        Database.Project.NAME), new String[] { BaseColumns._ID,
                        Database.Project.C_PROJECTTITLE, Database.Project.C_SMALLIMAGE }, null, null,
                        null), new String[] { Database.Project.C_PROJECTTITLE, Database.Project.C_SMALLIMAGE }, new int[] {
                        R.id.txt_title, R.id.image });
        listView.setAdapter(projectAdapter);
        projectAdapter.notifyDataSetChanged();


        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              

                Intent i = new Intent(ProjectsList.this, DetailsActivity.class);
                i.setData(Uri.withAppendedPath(Uri.withAppendedPath(
                        LooserProvider.CONTENT_URI, Database.Project.NAME), Long
                        .toString(id)));
                i.putExtra("spendino.de.ProjectDetail.position",position);
                startActivity(i);
            }
        });

    }

    class MySimpleCursorAdapter extends SimpleCursorAdapter {

        public MySimpleCursorAdapter(Context context, int layout, Cursor c,
                String[] from, int[] to) {
            super(context, layout, c, from, to);
            loader = new ImageLoaderCache(context);
            this.context = context;
        }
        Activity activity= ProjectsList.this;
        Context context=null;
        ImageLoaderCache loader = null;

        public void setViewImage(ImageView v, String value) {
            v.setTag(value);
            loader.displayImage(value, activity, v);
        }
    }


}

ОБНОВЛЕНО вот LooserSync.java

public class LooserSync extends IntentService {

    public LooserSync() {
        super("LooserSyncService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Database.OpenHelper dbhelper = new Database.OpenHelper(getBaseContext());
        SQLiteDatabase db = dbhelper.getWritableDatabase();
        DefaultHttpClient httpClient = new DefaultHttpClient();
        db.beginTransaction();
        HttpGet request = new HttpGet(
                "http://liebenwald.spendino.net/admanager/dev/android/projects.json");
        try {
            HttpResponse response = httpClient.execute(request);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                InputStream instream = response.getEntity().getContent();
                BufferedReader r = new BufferedReader(new InputStreamReader(
                        instream), 8000);
                StringBuilder total = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    total.append(line);
                }
                instream.close();
                String bufstring = total.toString();
                JSONArray arr = new JSONArray(bufstring);
                Database.Tables tab = Database.Tables.AllTables.get(Database.Project.NAME);
                tab.DeleteAll(db);
                for (int i = 0; i < arr.length(); i++) {
                    tab.InsertJSON(db, (JSONObject) arr.get(i));
                }
                db.setTransactionSuccessful();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.endTransaction();
        db.close();

    }

}

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

Поскольку вы используете курсор для заполнения списка, вы должны получить новый или запросить старый после того, как вы что-то изменили (добавили, отредактировали или удалили) в вашей модели.

Когда вы получили новый курсор, вы можете передать его адаптеру, вызвав changeCursor () .

UPDATE

Следующий код будет получать новый курсор каждый раз, когда вызывается onResume ().Так что ваш список должен быть актуальным.Конечно, изменения в модели, сделанные во время отображения списка, не обновляются в списке.Если вы хотите обновить список в режиме реального времени, вам нужно реализовать какой-то шаблон наблюдателя.Таким образом, ваша активность будет уведомлена, когда модель изменится.

public class ProjectsList extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.projects_list);
        Intent serviceIntent = new Intent(this, LooserSync.class);
        startService(serviceIntent);
        ListView listView = (ListView) findViewById(R.id.lstText);

        final String[] from = new String[] { Database.Project.C_PROJECTTITLE, Database.Project.C_SMALLIMAGE };
        final int[] to = new int[] {R.id.txt_title, R.id.image};

        MySimpleCursorAdapter projectAdapter = new MySimpleCursorAdapter(this, R.layout.listitems, null, from, to);

        listView.setAdapter(projectAdapter);

        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              

                Intent i = new Intent(ProjectsList.this, DetailsActivity.class);
                i.setData(Uri.withAppendedPath(Uri.withAppendedPath(
                        LooserProvider.CONTENT_URI, Database.Project.NAME), Long
                        .toString(id)));
                i.putExtra("spendino.de.ProjectDetail.position",position);
                startActivity(i);
            }
        });

    }

    public void onResume(){
        Cursor cursor = managedQuery(Uri.withAppendedPath(LooserProvider.CONTENT_URI,
                        Database.Project.NAME), new String[] { BaseColumns._ID,
                        Database.Project.C_PROJECTTITLE, Database.Project.C_SMALLIMAGE }, null, null, null);

        ListView listView = (ListView) findViewById(R.id.lstText);                         
        ((CursorAdapter)listView.getAdapter()).changeCursor(cursor);
    }
0 голосов
/ 26 мая 2011

projectAdapter.notifyDataSetChanged();

замените вышеуказанную линию на заданную линию продувки, тогда вы получите решение вашей проблемы.

((MySimpleCursorAdapter)(ProjectsList.listView.getAdapter())).notifyDataSetChanged();

Ошибка: вам нужен адаптерсписка, после чего вы уведомляете адаптер списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...