Android ListView刷新

标签 android android-listview simplecursoradapter onresume notifydatasetchanged

我有一个 Listview,它从 sqlite 数据库中提取和显示数据。数据库第一列中的数据显示在 ListView 中,单击时,Activity 开始显示与第一列关联的列的其余部分。编辑数据时,ListView 需要更新以反射(reflect)这一点,但它不会显示更新,除非应用程序重新启动。

我试过在我的 onResume() 方法中调用 notifyDataSetChanged()startActivityForResult() 但这没有用。我应该使用什么方法来更新我当前代码中的 ListView

我了解可能会使用 SimpleCursorAdapter,但我已尝试实现该代码但没有成功。我是新手,需要实际代码来理解需要做什么。

public class LoginList extends Activity implements OnClickListener, OnItemClickListener {
    private ListView loginList;
    private Button webLogin;

    private ListAdapter loginListAdapter;

    private ArrayList<LoginDetails> loginArrayList;

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.login_listview);
        loginList = (ListView)
        findViewById(R.id.loginlist);
        loginList.setOnItemClickListener(this);

        webLogin = (Button)
        findViewById(R.id.button3);
        webLogin.setOnClickListener(this);

        loginArrayList = new ArrayList<LoginDetails>();
        loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
        loginList.setAdapter(loginListAdapter);
    }

    @Override
    public void onClick (View v) {
        Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
        startActivity(webLoginIntent);
    }

    public List<String> populateList () {
        List<String> webNameList = new ArrayList<String>();

        dataStore openHelperClass = new dataStore (this);

        SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

        Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null);

        startManagingCursor(cursor);

        while (cursor.moveToNext()) {
            String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
            String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
            String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
            String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
            String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));

            LoginDetails lpDetails = new LoginDetails();

            lpDetails.setsName(sName);
            lpDetails.setwUrl(wUrl);
            lpDetails.setuName(uName);
            lpDetails.setpWord(pWord);
            lpDetails.setlNotes(lNotes);

            loginArrayList.add(lpDetails);
            webNameList.add(sName);
        }

        sqliteDatabase.close();
        return webNameList;
    }


    @Override
    protected void onResume() {
        super.onResume();

        loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
        loginList.setAdapter(loginListAdapter);  

    }


@Override
    public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) {
        Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show();

        Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class);
        LoginDetails clickedObject = loginArrayList.get(arg2);

        Bundle loginBundle = new Bundle();
        loginBundle.putString("clickedWebSite",clickedObject.getsName());
        loginBundle.putString("clickedWebAddress",clickedObject.getwUrl());
        loginBundle.putString("clickedUserName",clickedObject.getuName());
        loginBundle.putString("clickedPassWord",clickedObject.getpWord());
        loginBundle.putString("clickedNotes",clickedObject.getlNotes());

        updateDeleteLoginInfo.putExtras(loginBundle);

        startActivityForResult(updateDeleteLoginInfo, 0);   
    }
}

最佳答案

这正是一个Loader非常适合。我建议你创建一个 SimpleCursorAdapter将数据库绑定(bind)到 UI(在本例中为 ListView),ContentProvider与数据库接口(interface),以及一个CursorLoader监视数据库的更改,并在必要时更新 UI。 Loader 将处理所有数据库更改并通过简单地更新您的适配器来更新您的 ListView。前期工作似乎很多,但一旦配置就非常强大,并且会在整个 Android 生命周期中发挥作用。

这些教程应该会有帮助:

关于Android ListView刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823728/

相关文章:

java - 无法解析我用来初始化适配器的方法 'getActivity()'

android - 如何将 SimpleCursorAdapter 与 single_choice 和 multiple_choice 一起使用

android - 使用简单的光标拖放

android - 创建 CursorLoader 时未定义 SwapCursor

android - 为什么抽屉导航在第一次打开时滞后?

支持 MPEG-DASH 的 Android 媒体播放器

android - Twitch 应用程序如何流式传输到 Android?

android - 处理 Android 中的 C2DM 错误 ACCOUNT_MISSING

android - 带有 horizo​​ntalScrollView OnItemClick 的 ListView 不起作用

java - 使用按钮上的 OnClickListener 返回 Android 列表中的位置