3

SimpleCursorAdapterプロジェクトのListViewのカスタムに画像ボタンを追加しようとしていますが、1つのフィールドの値を繰り返して完全にランダムにするという問題が1つあります。

これはそのコードです:

public class MyCursorAdapter extends SimpleCursorAdapter {
    public MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        super.bindView(view, context, cursor);
        final Context t = context;
        final Cursor c = cursor;

        ImageButton delimageButton = (ImageButton)view.findViewById(R.id.deletebutton);

        delimageButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

               Toast.makeText(t,
                "Delete ID: " + c.getInt(c.getColumnIndex(MyDBAdapter.KEY_ID)), Toast.LENGTH_SHORT).show();

            }

        });

        if(cursor.getLong(cursor.getColumnIndex(MyDBAdapter.KEY_OWNID))>0)
        {   
            TextView own = (TextView)view.findViewById(R.id.ownInfo);
            own.setText("OWN");
        }
        else
        {
            TextView own = (TextView)view.findViewById(R.id.ownInfo);
            own.setText("");
        }
    }
}

ここで、delimageButtonを押すListViewと、現在のビューにある1つのレコード(行)のランダムなIDが表示されます(表示できますが、正しいIDではありません)。たとえば、画面に5行のように表示され、ボタンの1つを押すと、他の行(5つのうちの1つ)のIDが取得されますが、(ほとんどの場合)押したこの行は取得されません。この独自のTextViewにはいくつかのトリックがあったことを覚えていますが、ここにどのように配置できるかわかりません。

では、正しいIDを表示する方法を教えてください。

喜んでお手伝いさせていただきます。

編集

呼び出しと一緒にListViewを設定する責任があるコード全体がありますMyCursorAdapter

private void refreshList() {
        mySQLiteAdapter = new MyDBAdapter(this);
        mySQLiteAdapter.open();
        String[] columns = { MyDBAdapter.KEY_TITLE, MyDBAdapter.KEY_GENRE,
                MyDBAdapter.KEY_OWNID, MyDBAdapter.KEY_ID };
        Cursor contentRead = mySQLiteAdapter.getAllEntries(false, columns,
                null, null, null, null, MyDBAdapter.KEY_TITLE, null);
        startManagingCursor(contentRead);
        Log.d(TAG, Integer.toString(contentRead.getCount()));
        MyCursorAdapter adapterCursor = new MyCursorAdapter(this,
                R.layout.my_row, contentRead, columns, new int[] {
                        R.id.rowTitle, R.id.detail });
        this.setListAdapter(adapterCursor);
        mySQLiteAdapter.close();
    }

明確にするために、アクティビティはListActivityです。

4

1 に答える 1

2

カーソルOnClickListenerが作成されたときではなく、クリックされたときにカーソルからIDを取得しています。その間、スクロールするとリストビューのカーソル位置が変化します。

よく見ると、トーストには、クリックしたボタンを含むアイテムではなく、最後に読み込まれたアイテムの ID が表示されていることがわかります。

次のように、クリック リスナーを作成するときに ID を取得することで、これを解決できます。

delimageButton.setOnClickListener(new OnClickListener() {
    private int id = c.getInt(c.getColumnIndex(MyDBAdapter.KEY_ID));
    @Override
    public void onClick(View arg0) {
        Toast.makeText(t,
            "Delete ID: " + id, Toast.LENGTH_SHORT).show();
    }
});
于 2013-01-05T02:09:02.247 に答える