0

現在、simplecursor アダプターをオーバーライドして、各リスト項目に imagbutton を使用できるようにしようとしています。

これまでのコード:

public class MyCursorAdapter extends SimpleCursorAdapter {
    Cursor mCursor;
    final int tIndex;

    final class ViewHolder{
        public TextView textView;
        public ImageButton imageButton;

    }

    public MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
        mCursor = c;
        tIndex = mCursor.getColumnIndex(DBAdapter.TASK);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (mCursor.moveToPosition(position)){
            ViewHolder viewHolder;
            final int i = position;
        if (convertView == null){
            LayoutInflater inflater = MainActivity.this.getLayoutInflater();
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.listview,parent,false);
            viewHolder.textView = (TextView)convertView.findViewById(R.id.taskName);
            viewHolder.imageButton = (ImageButton)convertView.findViewById(R.id.edit_task);
            viewHolder.imageButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d("LOG_TAG", "It Works: " + i);
                }
            });
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();

        }

            String task = mCursor.getString(tIndex);
            viewHolder.textView.setText(task);
        }
        return convertView;
    }
}

親アクティビティを使用してデータベースの内容を表示し、代替アクティビティを使用してデータベースにデータを追加します。代替アクティビティで finish() を呼び出して、使用する onResume() メソッドの親アクティビティで、ユーザーが親アクティビティに戻されるようにします。

@Override
protected void onResume() {
    super.onResume();
    cursor.moveToFirst();
    myCursorAdapter.swapCursor(cursor = db.getAllRows());
    list.startLayoutAnimation();
    amountTasks();
}

ユーザーが親アクティビティに戻ると、データが正しく表示されず、リストビューのテキストが最後のエントリの複製になり、位置が 0 になります。

returnステートメントを次のように変更すると、次のようになることがわかりました。

return super.getView(position,convertView,parent)

テキストは正しく表示されますが、位置はまだ 0 を返します。

なぜこれが起こっているのですか?

4

2 に答える 2

0

しばらくカーソルを使用していませんがmoveToPosition()getView()メソッドでカーソルを使用する必要がありますか? 私の知る限り、処理する必要があるのは ViewHolder と値の設定だけです。カーソル内の位置を変更するべきではありません。

この質問を見てください。役立つ場合があります。

于 2013-07-13T17:00:42.387 に答える
0

解決策は、getview の代わりに bindview を使用することでした。実装もはるかに簡単です。

Stewart & pskink のクレジット:

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        super.bindView(view, context, cursor);
        final int i = cursor.getPosition();
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.imageButton = (ImageButton)view.findViewById(R.id.edit_task);
            viewHolder.imageButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d("LOG_TAG","Position: "+i);
                }
            });
    }

getview オーバーライドは必要ありませんでした。

于 2013-07-15T12:40:06.743 に答える