代码之家  ›  专栏  ›  技术社区  ›  Ben

如何在更新数据库后更新ListView?

  •  3
  • Ben  · 技术社区  · 8 年前
    public class SettingsActivity extends AppCompatActivity {
    private Context context;
    private DogDatabaseHelper dbHelper;
    private ListView mListView;
    private ArrayList<String> names = new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        setContentView(R.layout.settings);
        mListView = (ListView)findViewById(R.id.listforall);
        context = this;
    
        DogDatabaseHelper dbHelper = new DogDatabaseHelper(getApplicationContext());
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("select name from dog",null);
        int count = cursor.getColumnIndex("name");
        if(cursor.moveToFirst()){
    
            do{
                names.add(cursor.getString(cursor.getColumnIndex("name")));
            }while (cursor.moveToNext());
            AdapterForNames namesAdapter = new AdapterForNames(this,names);
            namesAdapter.notifyDataSetChanged();
            mListView.setAdapter(namesAdapter);
    
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
                    intent.putExtra("name",names.get(position));
                    startActivity(intent);
                }
            });
        }
    }
    

    这是 ListView 我正在使用,但在更新数据库后,我无法获取 列表视图 刷新后,我想我应该在重新启动方法中放入一些代码?但不知道该怎么办。有什么帮助吗?

    4 回复  |  直到 8 年前
        1
  •  1
  •   Shridutt Kothari    8 年前

    更改以下代码:

    public class SettingsActivity extends AppCompatActivity {
    private Context context;
    private DogDatabaseHelper dbHelper;
    private ListView mListView;
    private ArrayList<String> names = new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        setContentView(R.layout.settings);
        mListView = (ListView)findViewById(R.id.listforall);
        context = this;
    
        DogDatabaseHelper dbHelper = new DogDatabaseHelper(getApplicationContext());
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("select name from dog",null);
        int count = cursor.getColumnIndex("name");
        if(cursor.moveToFirst()){
    
            do{
                names.add(cursor.getString(cursor.getColumnIndex("name")));
            }while (cursor.moveToNext());
            AdapterForNames namesAdapter = new AdapterForNames(this,names);
            namesAdapter.notifyDataSetChanged();
            mListView.setAdapter(namesAdapter);
    
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
                    intent.putExtra("name",names.get(position));
                    startActivity(intent);
                }
            });
        }
    }
    

    使用以下代码:

    public class SettingsActivity extends AppCompatActivity {
        private Context context;
        private DogDatabaseHelper dbHelper;
        private ListView mListView;
        private ArrayList<String> names = new ArrayList<String>();
        @Override
        public void onCreate(Bundle savedInstance){
            super.onCreate(savedInstance);
            setContentView(R.layout.settings);
            context = this;
            AdapterForNames namesAdapter = new AdapterForNames(this,names);
            mListView = (ListView)findViewById(R.id.listforall);
            mListView.setAdapter(namesAdapter);
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
                    intent.putExtra("name",names.get(position));
                    startActivity(intent);
                }
            });
    
            DogDatabaseHelper dbHelper = new DogDatabaseHelper(getApplicationContext());
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            Cursor cursor = db.rawQuery("select name from dog",null);
            int count = cursor.getColumnIndex("name");
            if(cursor.moveToFirst()){
                do{
                    names.add(cursor.getString(cursor.getColumnIndex("name")));
                    namesAdapter.notifyDataSetChanged();
                } while (cursor.moveToNext());
            }
        }
    

    希望能有所帮助!

        2
  •  0
  •   Rahul    8 年前

    只需用新数据(ArrayList名称)更新列表并执行以下代码

    namesAdapter.notifyDataSetChanged();
    
        3
  •  0
  •   Shridutt Kothari    8 年前

    你做得不对:

    在循环中调用以下代码:

    AdapterForNames namesAdapter = new AdapterForNames(this,names);
    namesAdapter.notifyDataSetChanged();
    mListView.setAdapter(namesAdapter);
    

    相反,您应该在循环之外只执行一次以下三项任务:
    1.创建适配器,
    2.在listview上设置,
    3.设置OnItemClickListener,
    因此,在循环外的两条线以下移动:

    AdapterForNames namesAdapter = new AdapterForNames(this,names);
    mListView.setAdapter(namesAdapter);
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
                    intent.putExtra("name",names.get(position));
                    startActivity(intent);
                }
            });
    

    在循环内部,您应该调用:

    namesAdapter.notifyDataSetChanged();
    

    注: 您只需要在设置Adapter on列表后更新数据源,并通知适配器数据已更新。全部休息 是一次性过程。

    希望能有所帮助!

        4
  •  0
  •   sandeep    8 年前

    注册广播接收器,如下所示

    public class dbUpdateReceiver extends BroadcastReceiver {    
            @Override
            public void onReceive(Context context, Intent intent) {    
                names.add("newly added name");
                namesAdapter.notifyDataSetChanged();
            }
        }
    

      IntentFilter filter = new IntentFilter("db_update_action");    
      registerReciever(new dbUpdateReceiver(), filter);
    

    每当像下面这样添加新记录时发送此操作

    Intent intent=new Intent("db_update_action");
    sendBroadCast(intent);