2013-07-13 28 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來使它工作:) –