CursorAdapter以奇怪的方式更新列表

时间:2014-02-17 11:41:45

标签: android listview android-cursoradapter

我正在使用带有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不等于“已确认”,此部分也会执行。它等于“预订”

。 。 这是截图。 滚动之前:

  

enter image description here

向下滚动并向上滚动后:

  

enter image description here

当光标中的“状态”为“已确认”时,理想情况下应显示驱动程序信息按钮和绿色状态文本。 请帮忙。

0 个答案:

没有答案