覆盖SimpleCursorAdapter返回的错误数据和位置

时间:2013-07-13 16:39:51

标签: android android-listview simplecursoradapter

我正在尝试覆盖一个简单的适配器,以允许我为每个列表项使用一个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.

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

我有一段时间没有使用过游标你确定moveToPosition()方法中有getView()吗? AFAIK,您需要处理的是ViewHolder和设置值,您不应该更改光标中的位置。

看看this question,它可能会有所帮助。

答案 1 :(得分:0)

解决方案是使用bindview而不是getview,也更容易实现。

归功于斯图尔特& 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覆盖。