2013-07-13 29 views
0

我目前正试图重写一个简单的适配器,以允许我为每个listitem使用一个imagbutton。重写SimpleCursorAdapter不正确的数据和位置返回

代码到目前为止:

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; 
    } 
} 

使用我父活动显示数据库的内容,并使用备用活动将数据添加到数据库中。我称光洁度()上交替活动,以确保用户被返回给父活动,在的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.

任何想法为什么会发生这种情况?

+1

一般不要扩展SimpleCursorAdapter,请使用http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html代替 – pskink

+0

@pskink感谢您的建议,我会研究所提到的实现函数:) –

回答

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覆盖是没有必要的。

0

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

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

+0

感谢您的建议,但是这样做导致整个列表视图填充数据库的第一个条目,因此这就是为什么我添加了提及方法。 –

+1

您是否尝试过使用bindView()和newView()方法而不是getView()? – Stewart

+0

我还没有尝试使用这些方法,@pskink也建议尝试使用bindView,我会尝试使用bindview来使它工作:) –