Проблема привязки данных адаптера курсора

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

Например, если я нажимаю на изображение в элементе 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;
    }
}

person Nitish    schedule 14.10.2014    source источник


Ответы (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:).

person Nitish    schedule 16.10.2014