как обновить Android ListActivity при изменении данных подключенного SimpleCursorAdapter - PullRequest
0 голосов
/ 29 марта 2012

У меня есть следующий код. Чего я хочу добиться, так это обновить отображаемый список, когда я нажимаю на запись, чтобы я мог просматривать список. Я нашел два некомментированных способа сделать это здесь на stackoverflow, но ни один из них не работает. Я также получил совет по созданию новой функции ListActivity для обновления данных, но это звучит как растрата ресурсов?

РЕДАКТИРОВАТЬ: Я нашел решение сам. Все, что вам нужно сделать, это вызвать «SimpleCursorAdapter.changeCursor (new Cursor);». Никаких уведомлений, никаких вещей в UI-Thread или чем-либо еще.

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MyActivity extends ListActivity {
    private DepartmentDbAdapter mDbHelper;
    private Cursor cursor;
    private String[] from = new String[] { DepartmentDbAdapter.KEY_NAME };
    private int[] to = new int[] { R.id.text1 };
    private SimpleCursorAdapter notes;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.departments_list);
    mDbHelper = new DepartmentDbAdapter(this);
    mDbHelper.open();

    // Get all of the departments from the database and create the item list
    cursor = mDbHelper.fetchSubItemByParentId(1);
    this.startManagingCursor(cursor);

    // Now create an array adapter and set it to display using our row
    notes = new SimpleCursorAdapter(this, R.layout.department_row, cursor, from, to);
    this.setListAdapter(notes);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        // get new data and update the list
        this.updateData(safeLongToInt(id));
    }

    /**
     * update data for the list
     * 
     * @param int departmentId id of the parent department
     */
    private void updateData(int departmentId) {     
        // close the old one, get a new one
        cursor.close();
        cursor = mDbHelper.fetchSubItemByParentId(departmentId);

    // change the cursor of the adapter to the new one
    notes.changeCursor(cursor);
    }

    /**
     * safely convert long to in to save memory
     * 
     * @param long l the long variable
     * 
     * @return integer
     */
    public static int safeLongToInt(long l) {
    if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
        throw new IllegalArgumentException
            (l + " cannot be cast to int without changing its value.");
    }
    return (int) l;
    }

}

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вам нужно уведомить свой ListVIew, когда ваши данные будут изменены.

adapter.notifyDataSetChanged();

в вашем случае.

notes.notifyDataSetChanged();

Надеюсь, это может помочь вам ...

0 голосов
/ 29 марта 2012

Во-первых, каждый раз, когда вы открываете новый курсор, закрываете предыдущий и управляете новым.

Во-вторых, вы меняете курсор, но как ваш адаптер курсора узнает об этом?Это не так.Либо вы создаете адаптер, который может изменить свой курсор, либо создаете новый SimpleCursorAdapter вокруг вашего нового курсора и подключаете его к списку.

Но вы были правы, вам не следует заново создавать виджет списка.

...