Android 游标适配器数据绑定问题
我在我的应用程序中使用了游标适配器。适配器已绑定到Android 游标适配器数据绑定问题,android,android-cursoradapter,Android,Android Cursoradapter,我在我的应用程序中使用了游标适配器。适配器已绑定到列表片段。listview显示正确。在适配器视图中,我有两个TextView和一个imageview。在imageview上,我添加了onClickListener。listview显示正确。但是,当我单击列表中任何索引处的imageview时,它不是获取该索引的数据,而是获取其他索引的数据 例如,如果我单击listview项目2中的imageview(列表中的项目位置将为1),则它不是从光标获取该位置的数据,而是获取其他位置(5、6、0等)的数
列表片段
。listview显示正确。在适配器视图中,我有两个TextView和一个imageview。在imageview上,我添加了onClickListener
。listview显示正确。但是,当我单击列表中任何索引处的imageview时,它不是获取该索引的数据,而是获取其他索引的数据
例如,如果我单击listview项目2中的imageview(列表中的项目位置将为1),则它不是从光标获取该位置的数据,而是获取其他位置(5、6、0等)的数据。我搜索了很多关于这个问题的信息,但是没有找到任何相关的答案。下面是我的光标或适配器的代码
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;
}
}
找到解决办法了。我忘了为每个项目调用bindView
。因此,在前面的例子中,cursor.getString(CLIENT\u GUID\u INDEX)
总是返回光标中最后一项的GUID id。我将代码更改为:
final String clientGuid = cursor.getString(CLIENT_GUID_INDEX);
holder.navigateNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
navigateToClientDetailFragment(clientGuid);
}
});
如果有人认为我的假设是错误的,并且可能的原因是我对光标适配器不太熟悉,我想提出一些意见