2014-10-14 2 views
1

Я использовал адаптер курсора в своем приложении. Адаптер привязан к listfragment. Список отображается корректно. В моем представлении адаптера у меня есть два текстовых изображения и изображение. Над просмотром изображения я добавил onClickListener. Отображение списка отображается правильно. Но когда я нажимаю на изображение в любом индексе в списке, вместо того, чтобы получать данные для этого индекса, он получает данные для некоторого другого индекса.Cursor Adapter Ошибка привязки данных

Например, если я нажимаю на изображение в элементе 2 списка (позиция позиции в списке будет 1) вместо того, чтобы получать данные из этой позиции из курсора, он получает данные для какой-либо другой позиции (5, 6, 0 и т. Д.). Я много раз искал эту проблему, но не нашел подходящего ответа. Ниже мой CursorAdapter's код

public class ClientListAdapter extends CursorAdapter { 
    private static final String TAG = "ClientListAdapter"; 
    private final int PRIMARY_PHOTO_INDEX = 1; 
    private final int LAST_NAME_INDEX = 2; 
    private final int FIRST_NAME_INDEX = 3; 
    private final int CLIENT_GUID_INDEX = 4; 
    private NavigateToClientDetailListener mClientDetailListener; 

    public ClientListAdapter(Context context, Cursor c, int flags) { 
     super(context, c, flags); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = inflater.inflate(R.layout.client_list_adapter, parent, false); 
     holder.imgClientPhoto = (ImageView) v.findViewById(R.id.imgClientPhoto); 
     holder.txtFirstName = (TextView) v.findViewById(R.id.txtFirstName); 
     holder.txtLastName = (TextView) v.findViewById(R.id.txtLastName); 
     holder.navigateNext = (ImageView) v.findViewById(R.id.navigateNext); 
     v.setTag(holder); 
     return v; 
    } 

    @Override 
    public void bindView(final View view, final Context context, 
      final Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 

     // byte[] imgByteArray = cursor.getBlob(PRIMARY_PHOTO_INDEX); 

     holder.txtLastName.setText(cursor.getString(LAST_NAME_INDEX)); 
     holder.txtFirstName.setText(cursor.getString(FIRST_NAME_INDEX)); 

     holder.navigateNext.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.e(TAG, "btnNext onCLick "+" Client Name: "+cursor.getString(LAST_NAME_INDEX)+" "+cursor.getString(FIRST_NAME_INDEX)); 
       navigateToClientDetail(cursor.getString(CLIENT_GUID_INDEX)); 
      } 
     }); 
    } 

    static class ViewHolder { 
     ImageView imgClientPhoto, navigateNext; 
     TextView txtLastName, txtFirstName; 
    } 

    private void navigateToClientDetail(String clientGuid) { 
     mClientDetailListener.gotoClientDetail(clientGuid); 
    } 

    public void setNavigateToClientDetailListener(
      NavigateToClientDetailListener mClientDetailListener) { 
     this.mClientDetailListener = mClientDetailListener; 
    } 
} 

ответ

1

Получили решение. Я забыл, что для каждого элемента вызывается bindView. Таким образом, в предыдущем случае cursor.getString(CLIENT_GUID_INDEX) всегда возвращал путевой идентификатор последнего элемента в курсоре. Я изменил код, как:

final String clientGuid = cursor.getString(CLIENT_GUID_INDEX); 

holder.navigateNext.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     navigateToClientDetailFragment(clientGuid); 
    } 
}); 

Я хотел бы иметь комментарии, если кто-то чувствует мое предположение неверно и, возможно, причина в том, что-то еще, как я не очень знаком с cursor adapter :).

Смежные вопросы