1

データがsqliteから取得されたリストビューを作成し、ラジオボタンを使用して名前または場所で並べ替えるようにします

これは私のコードです

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        db = new DatabaseHelper(this);
        RadioButton rbname = (RadioButton)findViewById(R.id.radio0);
                RadioButton rblocation = (RadioButton)findViewById(R.id.radio1);

            if (rbname.isChecked()){
            Cursor = db
                .getReadableDatabase()
                .rawQuery("SELECT *  FROM " + DatabaseHelper.LIST + " ORDER BY " + DatabaseHelper.NAME, null);  
            ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, Cursor,
                new String[] {DatabaseHelper.NAME, DatabaseHelper.ADDRESS, DatabaseHelper.GENDER, DatabaseHelper.LOCATION},
                new int[] {R.id.txtName, R.id.txtAddress, R.id.txtGender, R.id.txtLocation});       
            setListAdapter(adapter);

            }

            else if (rblocation.isChecked()){
                Cursor = db
                        .getReadableDatabase()
                        .rawQuery("SELECT *  FROM " + DatabaseHelper.LIST+ " ORDER BY " + DatabaseHelper.LOCATION, null);   
                ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, Cursor,
                        new String[] {DatabaseHelper.NAME, DatabaseHelper.ADDRESS, DatabaseHelper.GENDER, DatabaseHelper.LOCATION},
                        new int[] {R.id.txtName, R.id.txtAddress, R.id.txtGender, R.id.txtLocation});       
                    setListAdapter(adapter);
            }


        registerForContextMenu(getListView());
    }

ListAdapterCursor.requery()をBaseAdapterに変更して、使用できるようにします。notifydatasetchanged()

しかし、何も起こりません..私のリストビューはまだ更新されません

この問題を解決する方法を教えてください

4

2 に答える 2

1

あなたがする必要があるのは、あなたのコードをリスナーに入れて、ボタンがクリックされた後にあなたのイベントがアクティブになるようにすることonCreateです。さらに、カーソルで裏打ちされたリストビューを取得して変更するには、カーソルを再インスタンス化changeCursorしてアダプタを呼び出します。次のコードでわかりやすくなることを願っています。

private RadioButton rbname, rblocation;
private SimpleCursorAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    db = new DatabaseHelper(this);
    rbname = (RadioButton)findViewById(R.id.radio0);
    rblocation = (RadioButton)findViewById(R.id.radio1);

    Cursor cursor = db
            .getReadableDatabase()
            .rawQuery("SELECT *  FROM " + DatabaseHelper.LIST + " ORDER BY " + DatabaseHelper.NAME, null);
    // a default cursor
    adapter = new SimpleCursorAdapter(this, R.layout.row, Cursor,
            new String[] {DatabaseHelper.NAME, DatabaseHelper.ADDRESS, DatabaseHelper.GENDER, DatabaseHelper.LOCATION},
            new int[] {R.id.txtName, R.id.txtAddress, R.id.txtGender, R.id.txtLocation});       
    setListAdapter(adapter);    // do the adapter stuff here to avoid repeating code
    initListeners(); // set up the listeners for the radio buttons

    registerForContextMenu(getListView());
}

private void initListeners() {

    rbname.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                Cursor cursor = db
                        .getReadableDatabase()
                        .rawQuery("SELECT *  FROM " + DatabaseHelper.LIST + " ORDER BY " + DatabaseHelper.NAME, null);
                adapter.changeCursor(cursor); // change cursor in adapter so that listview changes                  
            }               
        }
    });

    rblocation.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                Cursor cursor = db
                        .getReadableDatabase()
                        .rawQuery("SELECT *  FROM " + DatabaseHelper.LIST+ " ORDER BY " + DatabaseHelper.LOCATION, null);   
                adapter.changeCursor(cursor);   
            }               
        }
    });
}
于 2012-11-25T09:37:19.593 に答える
1

私はずっと前に同じ問題を抱えていました。助けになったのはrefreshメソッドを生成することでした。したがって、更新が必要になるたびに、このメソッドを呼び出すだけでした。

         private void refresh() {
           ListView yourListView = getListView();   
           list = getList(); //this is a List<string>
           adapter = new ArrayAdapter<String> (this,R.layout.your_listview_item,list); //this is ArrayAdapter<String>       
           yourListView.setAdapter(adapter);
           yourListView.invalidateViews();
}

これは私のListActivityでうまくいきました

于 2012-11-25T07:58:27.473 に答える