0

私はまだカスタムがどのように機能するかを正確に理解していないCursorAdapterので、懸命に試した後、ここにあります:

  1. 内のボタンにリスナーを実装しますgetView()
  2. リスナーは行の削除イベントを起動します。
  3. そのために、すべてのクラスからの要求を実行できるシングルトンデータベースを使用します(実際にはシングルトンの目的)
  4. 私は通常、アクティビティクラスから更新(挿入および変更)するので、新しいデータベースカーソルを取得して、それを新しいに再割り当てするだけCursorAdapterで、自分自身をに再割り当てしますListView
  5. ここでは違います。私はメソッドのCursorAdapterクラス内にListViewいて、アダプターを内部から更新する方法がわかりません。

私の退屈な説明を読みたくない人のために、ここにコードがありますgetView

    @Override
public View getView(int position, View convertView, ViewGroup parent){
    convertViewParam = convertView;
    ViewHolder viewHolder = new ViewHolder();
    if (convertViewParam == null) {
        int type = getItemViewType(position);
        switch (type) {

        case TYPE_ADD_NOTE_TOP:
            convertViewParam = inflater.inflate(R.layout.add_note_top, null);
            viewHolder.contentNote = (EditText)convertViewParam.findViewById(R.id.add_note_top_id);
            break;
        case TYPE_ITEM:
            convertViewParam = inflater.inflate(R.layout.row_note, null);
            viewHolder.delete = (Button)convertViewParam.findViewById(R.id.delete);
            if (deleteMode){
                viewHolder.delete.setVisibility(View.VISIBLE);
            }else{
                viewHolder.delete.setVisibility(View.GONE);
            }

            viewHolder.contentNote = (TextView)convertViewParam.findViewById(R.id.note);

            getCursor().moveToPosition(position - 1);
            int currentPosition = getCursor().getPosition();
            Cursor c = getCursor();
            c.moveToPosition(currentPosition);

            ((TextView) viewHolder.contentNote).setText(c.getString(c.getColumnIndex("content_note")));
            int rowId = c.getInt(c.getColumnIndex("_id"));

            viewHolder.delete.setTag(new Integer(rowId));
            viewHolder.contentNote.setTag(new Integer(rowId));

            OnClickListener listener = new OnClickListener() {

                @Override
                public void onClick(View v) {
                    int thePosition = (Integer) v.getTag();

                    int posCurs = notesCursorAdapter.getCursor().getPosition();
                    NoteDataSource.getSingletonObject(context).deleteNote(thePosition, context);
                    notesCursorAdapter.changeCursor(NoteDataSource.getSingletonObject(context).getAllNotes());
                    notesCursorAdapter.notifyDataSetChanged();

                }
            };
            viewHolder.delete.setOnClickListener(listener);

            break;

        case TYPE_ADD_NOTE_BOTTOM:
            convertViewParam = inflater.inflate(R.layout.add_note_bottom, null);
            LinearLayout linearLayout = (LinearLayout)convertViewParam.findViewById(R.id.bottomLayout);
            linearLayout.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
            break;
        }
        convertViewParam.setTag(viewHolder);
    } else {

        viewHolder = (ViewHolder)convertViewParam.getTag();
        if (viewHolder.contentNote!=null){
            if (viewHolder.contentNote.getTag() == convertViewParam.findViewById(R.id.note)){
                int test = (Integer) viewHolder.delete.getTag();
                System.out.println("current tag " + test);
                String txt = getCursor().getString(getCursor().getColumnIndex("content_note"));
                ((TextView) viewHolder.contentNote).setText(txt);
            }
        }


    }

    return convertViewParam;
}

削除イベントを起動すると、次のエラーが発生します。

03-28 17:51:32.996: E/AndroidRuntime(7115): android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2

詳細についてはお問い合わせください。

バグ修正または単なる説明を探しています、ありがとう。

4

2 に答える 2

2

それは非常によく書かれた問題ステートメントです。私はこの問題を抱えていて、頭を悩ませました。これを試して。

  • アダプタでリスナーを作成します。
public interface ItemDeletedListener(){
    public void itemDeleted(int position);
}
  • アダプタm_listenerにItemDeletedListenerのインスタンスを作成します。

  • セッター関数setItemDeletedListener(ItemDeletedListener listener){}を記述します

  • getView()、onClickListenerで、m_listenerを呼び出し、削除する必要のある位置を渡します。

アクティビティで、次の手順を実行します。

  1. 上で作成したリスナーを実装します。
  2. 実装では、削除作業を行ってから、そこでchangeCursor()を実行します。
于 2012-03-28T10:14:19.557 に答える
1

どの行で例外が発生するかを知ると役立ちます。まず第一に悪いことは、位置に基づいてデータベースからメモを削除し、intその後、すべてのデータを再度フェッチして、そのカーソル上の位置を前の削除された位置に移動することです。

データベースに3つのメモがあり(そしてそれらをリストに表示し)、最後のメモを削除したい場合、これは起こります:

  • thePositionなります2
  • メモを削除します
  • データベースからすべてのメモを再度フェッチします(1つ削除したため、カーソルは2行になります)
  • カーソルをthePosition(値2)に移動します
  • カーソルには2行(0から番号が付けられています)しかなく、番号2の行を要求します
  • 例外

_idメモを削除する場合は、その行のをタグとして渡し、それを使用してメモを削除します。

Cursor c = getCursor();
c.moveToPosition(position); 
long rowId = c.getLong(c.getColumnIndex("_id"));
viewHolder.delete.setTag(new Long(rowId));

次に、メソッドでそれを使用してメモを削除し、カーソル上のをonClick()いじるのをやめます。moveToPosition()

于 2012-03-28T10:15:58.923 に答える