0

我仍然不知道自定义CursorAdapter应该如何工作,所以经过努力,事情是这样的:

  1. 我在我的getView().
  2. 侦听器启动删除行事件。
  3. 为此,我使用了一个单例数据库,我可以在其中执行来自所有类的请求(实际上是单例的目的)
  4. 我通常从活动类更新(插入和修改),所以我只需要获取新的数据库游标并将其重新分配给一个新CursorAdapterListView.
  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 的实例。

  • 写一个setter函数,setItemDeletedListener(ItemDeletedListener listener){}

  • 在你的getView()、onClickListener 中,调用m_listener 并传递需要删除的位置。

现在在您的活动中,执行以下操作。

  1. 实现您在上面创建的侦听器。
  2. 在您的实现中,执行删除工作,然后在此处执行 changeCursor()。
于 2012-03-28T10:14:19.557 回答
1

了解您在哪一行得到异常会有所帮助。首先一件坏事是你根据一个位置从数据库中删除一个注释,int然后你再次获取所有数据并将该光标上的位置移动到先前删除的位置。

如果您在数据库中有 3 条笔记(并在列表中显示它们)并且您想删除最后一条,则会发生这种情况:

  • thePosition2
  • 你删除笔记
  • 再次从数据库中获取所有笔记(游标现在将有 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 回答