【问题标题】:simple adapter cant update database简单的适配器无法更新数据库
【发布时间】:2016-01-28 12:14:07
【问题描述】:

大家好,我已经使用简单的适配器从我的数据库中创建了一个数据列表视图,但我不知道如何在每次数据库更改时更新它。有什么帮助吗?notifyDataSetChanged();方法不起作用,我不知道该怎么做。

MainActivity

      @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_general_discussion);
    db = new SQLiteHandler(this);

    ArrayList<HashMap<String, String>> emaillist = db.getMessage();
    if (emaillist.size() != 0) {
         ListAdapter adapter = new SimpleAdapter(MainActivity.this, emaillist,
                R.layout.raw_layout,
                new String[]{"user_posted", "post", "posted_at", "post_id"}, new int[]{
                R.id.text_user_name, R.id.text_user_post, R.id.text_user_date, R.id.text_user_number});
        setListAdapter(adapter);

    }

HelperClass

    public ArrayList<HashMap<String, String>> getMessage(){
    ArrayList<HashMap<String, String>> message = new ArrayList<HashMap<String, String>>();
    String selectQuery = "SELECT  * FROM " + TABLE_POSTING;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if ( cursor.moveToFirst()) {
        do {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("post_id", cursor.getString(0));
            map.put("user_posted", cursor.getString(1));
            map.put("post", cursor.getString(2));
            map.put("posted_at", cursor.getString(3));
            message.add(map);
        } while (cursor.moveToNext());
    }

    return message;
}

【问题讨论】:

  • 能否请您添加更新功能以检查错误
  • 你在哪里调用notifyDataSetChanged,你是在主线程(也就是ui线程)上调用它吗?
  • 嘿,我将它添加到发布按钮点击事件中,所以每次我按下按钮时,列表都会更新
  • btnposting.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String post = inputPost.getText().toString().trim(); String user_posted = txtName.getText ().toString().trim(); if (!post.isEmpty()) { postThreads(post, user_posted); } else { Toast.makeText(getApplicationContext(), "请输入您的详细信息!", Toast.LENGTH_LONG ) .show(); } } });

标签: java android database android-sqlite simpleadapter


【解决方案1】:

声明您的适配器并列出全局级别

class example{
ListAdapter adapter;
ArrayList<HashMap<String, String>> emaillist;

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_general_discussion);
    db = new SQLiteHandler(this);

    emaillist = db.getMessage();
    if (emaillist.size() != 0) {
         adapter = new SimpleAdapter(MainActivity.this, emaillist,
                R.layout.raw_layout,
                new String[]{"user_posted", "post", "posted_at", "post_id"}, new int[]{
                R.id.text_user_name, R.id.text_user_post, R.id.text_user_date, R.id.text_user_number});
        setListAdapter(adapter);

    }

当你只想更新时

    adapter.notifyDataSetChanged();

【讨论】:

  • 没错。但是,这不是全局级别,而是实例级别。
【解决方案2】:

将您的适配器声明为 Public,然后拨打电话
adapter.notifyDatasetChange();
无论何时何地。这会更新。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我认为没有直接的方法来检查数据库中是否发生了变化 但您可以执行刷新之类的操作。

    将您的适配器设为全局,当触发操作时再次填充适配器并写入adapter.notifyDatasetChange();

    另一种方法是使用Thread,将其放入AsyncTask类型的内部类中 然后每分钟重新填充一次数组 然后在每次这样检查后写adapter.notifyDatasetChange();

    doInBackground(){
    while(true){
        checkDataBase();
    refillAdapter();
    adapter.notifyDatasetChange();
    
        Thread.sleep(1000*60);// sec * 60 sec =1min
    } 
    }
    

    看这个链接如何使用AsyncTask类http://developer.android.com/reference/android/os/AsyncTask.html

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      相关资源
      最近更新 更多