我正在使用带有Cursor Adapter的StickyListHeaders库,我面临一个非常奇怪的问题。 当我向下滚动列表并向后滚动时,第一个List项具有正确的数据,但有一半的数据不正确。这是代码,让我再解释一下。
import android.content.Context;
import android.database.Cursor;
import android.database.MergeCursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.TextView;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
public class BookingAdapter extends CursorAdapter implements StickyListHeadersAdapter {
MergeCursor c;
private LayoutInflater inflater;
Context mContext;
public BookingAdapter(Context context, MergeCursor c) {
super(context, c, true);
this.c = c;
mContext = context;
inflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return inflater.inflate(R.layout.history_card, viewGroup, false);
}
@Override
public void bindView(View v, Context context, Cursor cursor) {
final String tempname, tempnumber;
// here we are setting our data
// that means, take the data from the cursor and put it in views
Button cancelBooking = (Button) v.findViewById(R.id.cancelbooking);
Button driverInfo = (Button) v.findViewById(R.id.driverinfo);
TextView bookindId = (TextView) v.findViewById(R.id.bookingID);
TextView historyFrom = (TextView) v.findViewById(R.id.historyFrom);
TextView historyTo = (TextView) v.findViewById(R.id.historyTo);
TextView historyDateTime = (TextView) v.findViewById(R.id.historyDateTime);
TextView historyStatus = (TextView) v.findViewById(R.id.historyStatus);
bookindId.setText("Booking ID: " + cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1))));
historyFrom.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2))));
historyTo.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3))));
historyDateTime.setText("Booking at " + cursor.getString(cursor.getColumnIndex(cursor.getColumnName(7))) + " on " + cursor.getString(cursor.getColumnIndex(cursor.getColumnName(6))) + ".");
historyStatus.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(10))));
if (cursor.getString(cursor.getColumnIndex(cursor.getColumnName(10))).equals("Confirmed")) {
driverInfo.setVisibility(View.VISIBLE);
historyStatus.setTextColor(context.getResources().getColor(R.color.confirmed));
tempname = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(9)));
tempnumber = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(8)));
driverInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//figure out a way to create a dialog fragment from here
}
});
} else if (cursor.getString(cursor.getColumnIndex(cursor.getColumnName(10))).equals("Cancelled")){
cancelBooking.setVisibility(View.GONE);
driverInfo.setVisibility(View.GONE);
historyStatus.setTextColor(context.getResources().getColor(R.color.alert));
}
}
@Override
public View getHeaderView(int i, View convertView, ViewGroup viewGroup) {
HeaderViewHolder holder;
if (convertView == null) {
holder = new HeaderViewHolder();
convertView = inflater.inflate(R.layout.header, viewGroup, false);
holder.text = (TextView) convertView.findViewById(R.id.header_text);
convertView.setTag(holder);
} else {
holder = (HeaderViewHolder) convertView.getTag();
}
//set header text as first char in name
c.moveToPosition(i);
String headerText = c.getString(c.getColumnIndex(c.getColumnName(10)));
holder.text.setText(headerText);
return convertView;
}
@Override
public int getCount() {
return c.getCount();
}
@Override
public Object getItem(int position) {
c.moveToPosition(position);
return c;
}
@Override
public long getHeaderId(int i) {
c.moveToPosition(i);
if (c.getString(c.getColumnIndex(c.getColumnName(10))).equals("Confirmed")) {
return 2;
} else if (c.getString(c.getColumnIndex(c.getColumnName(10))).equals("Booked")) {
return 1;
} else {
return 3;
}
}
class HeaderViewHolder {
TextView text;
}
}
所以当我向下滚动回来后
if (cursor.getString(cursor.getColumnIndex(cursor.getColumnName(10))).equals("Confirmed")) {
driverInfo.setVisibility(View.VISIBLE);
historyStatus.setTextColor(context.getResources().getColor(R.color.confirmed));
tempname = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(9)));
tempnumber = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(8)));
driverInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//figure out a way to create a dialog fragment from here
}
});
即使cursor.getString不等于“已确认”,此部分也会执行。它等于“预订”
。 。 这是截图。 滚动之前:
向下滚动并向上滚动后:
当光标中的“状态”为“已确认”时,理想情况下应显示驱动程序信息按钮和绿色状态文本。 请帮忙。