0

今日の私の問題は、SimpleCursorAdapter私が実装したカスタムに関連しています。これが私の活動onCreate()と習慣SimpleCursorAdapterです:

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
    editor = customSharedPreference.edit();

    setContentView(R.layout.activity_1);
    op = new OperationsClass(getApplicationContext());
    op.open();

    Cursor cursor = op.getList();
    startManagingCursor(cursor);

    String[] columns = new String[] { "AAA", "BBB", "CCC"};
    int[] to = new int[] { R.id.entry_aaa,R.id.entry_bbb, R.id.entry_ccc};

    MyCursorAdapter mAdapter = new MyCursorAdapter(this, R.layout.custom_entry, cursor, columns, to);

    this.setListAdapter(mAdapter);

    op.close();
}

OperationsClassデータベースを管理し、getList()関数はエントリのカーソルを返します。

public class MyCursorAdapter extends SimpleCursorAdapter{

        private Context context;
        private MyCursorAdapter here = this;

        private int layout;

        public MyCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) {
            super(context, layout, c, from, to);
            this.context = context;
            this.layout = layout;
        }

        @Override
        public View newView(final Context context, Cursor cursor, ViewGroup parent) {

            Cursor c = getCursor();

            final LayoutInflater inflater = LayoutInflater.from(context);
            View v = inflater.inflate(layout, parent, false);

            int col1 = c.getColumnIndex("aaa");
            String name1 = c.getString(col1 );
            int col2 = c.getColumnIndex("bbb");
            String name2 = c.getString(col2 );
            int col3 = c.getColumnIndex("ccc");
            int name3 = c.getInt(col3 );

            final TextView text1 = (TextView) v.findViewById(R.id.entry_aaa);
            final TextView text2 = (TextView) v.findViewById(R.id.entry_bbb);
            final TextView text3 = (TextView) v.findViewById(R.id.entry_ccc);

            text1.setText(name);
            text2.setText(name2);

            if (name3 == 0)
                text3.setText("Not checked");
            else {
                text3.setText("Checked");
                text3.setOnClickListener(new View.OnClickListener()
                    {
                        public void onClick(View view)
                        {
                        text3.setText("Not checked");
                            // Here I would like to update my DB using
                            // OperationsClass and the SharedPrefs,
                            // and refresh the ListView with the new
                            // text value.
                        }
                    });
                }
            }
            return v;
        }

        @Override
        public void bindView(View v, final Context context, Cursor c) {
            // Same operations as higher
        }
}

基本的に私が達成したいのはListView、ユーザーが3番目の列をクリックしたときに更新することです。これは、値が変更されたことを意味します(クリックされたかどうか)。同時に、DBとSharedPreferences(両方のクラスの新しいオブジェクトを作成してアプリケーションコンテキストから回復することもできますが、それはかなり重いようです)を更新したいと思います。


また、が開かれたときに1つのアクティビティで実装されたメソッドの1つをトリガーする方法があるかどうかを知りたいAlertDialogです(同じアプリで、実際にを介してデータベースに要素を追加し、AlertDialogそれをポップしたアクティビティを作成したいupは新しいカーソルを取得し、そのリストを更新します)。

4

2 に答える 2

2

「基本的に私が達成したいことは」

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    // if (the id of selected view matches what you want) {
    boolean checked;
    if (text3.getText().toString() == "checked") {
        boolean checked = true;
    } else {
        boolean checked = false;
    }
    op.updateRead(id, checked);     
    refreshCursorAdapter();
    setSharedPrefs();
    // }

「ユーザーが 3 番目の列をクリックしたときに ListView を更新します。これは、値が変更されたことを意味します (クリックされたかどうかに関係なく)。」

private void refreshCursorAdapter() {
    Cursor cursor = op.getList();
    mAdapter.changeCursor(cursor);
}

「同時にDBも更新したい」

private boolean updateRead(long rowId, boolean checked) {
        ContentValues args = new ContentValues();
        if (checked) { 
            args.put("read", "1"); 
        } else { 
            args.put("read", "0");  
        }
        return db.update(DB_TABLE, args, "_id =" + rowId, null) > 0;
    }

「およびSharedPrefereces」

private void setSharedPrefs() {
    SharedPreferences settings = getSharedPreferences("MYPREFS", 0);
    SharedPreferences.Editor editor = settings.edit();
    if (checked) { 
        editor.putBoolean("read", false);
    } else { 
        editor.putBoolean("read", true);
    }
    editor.commit();
}

「AlertDialog が開かれたときに、1 つのアクティビティで実装されたメソッドの 1 つをトリガーする方法があるかどうかも知りたいです。」

正直なところ、これの背後にある神秘が何であるか理解できません。このプロセスには、同じコードを他のイベントにコピーして貼り付けることが含まれます。

于 2012-11-21T10:20:24.133 に答える
1

基本的に私が達成したいのは、ユーザーが 3 番目の列をクリックしたときに ListView を更新することです。これは、値が変更されたことを意味します (クリックされたか、されていないか)。同時に、DB と SharedPrefereces を更新したいと考えています (両方のクラスの新しいオブジェクトを作成し、アプリケーション コンテキストから回復することもできますが、かなり重いようです)。

newViewまず第一に、そのメソッドはリサイクルのためにすべての行に対して呼び出されるわけではないため、メソッドにそのロジックを実装するべきではありません。はnewView、新しい行ビューを構築するためだけに使用してください。このbindViewメソッドは、任意の行ロジックに使用します。

メソッドのコードに関しては、onClickどこに問題があるのか​​わかりません。Cursorロジックに基づいてデータベースを更新し、新しいデータでデータベースを再度クエリしてから、 を使用swapCursor()してアダプターを新しい値で更新します。これは機能するはずですが、主にメインの UI スレッドですべてのデータベース操作を行っているため、推奨される方法ではありません。startManagingCursorこのメソッドはメイン UI スレッドでクエリを実行するため、メソッドを使用しないでください 。代わりLoaderに、アクティビティに を実装してメイン UI スレッドからデータをロードすることを検討してください。を使用しLoaderてデータベースの値を更新し、 を再起動しLoaderてリストを更新します。

また、AlertDialog が開かれたときに 1 つのアクティビティで実装されているメソッドの 1 つをトリガーする方法があるかどうかも知りたいです (同じアプリで、実際には AlertDialog を介してデータベースに要素を追加し、Activity を作成したいと考えています)。ポップアップして新しいカーソルを取得し、そのリストを更新します)。

あなたはそれをどのように示すかについて何も言っていませんAlertDialog。新しい要素を追加した後にリストを更新する場合は、AlertDialogのボタンのリスナーと上記と同じコードを使用します。

于 2012-11-21T10:05:05.780 に答える