【问题标题】:Merging cursor only gives back first cursor in clickEvent合并光标仅在 clickEvent 中返回第一个光标
【发布时间】:2017-02-23 03:29:48
【问题描述】:

传递单击位置的光标,但是这样做时日志显示我无论在哪里单击都只得到第一行。

holder.mTopCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mCallback != null) {
                    mCallback.onTopListClick(cursor);
                    notifyDataSetChanged();
                    Log.i("FROMCLICK", DatabaseUtils.dumpCursorToString(cursor));
                }
            }
        });

即使我单击列表下方的 20 行,CursorAdapter onClickListener 内的日志也仅显示第一行光标。

@Override
    public void onTopListClick(Cursor cursor) {
        Log.i("FistClickBeforePassing", DatabaseUtils.dumpCursorToString(cursor));
        BottomFragment bottomFragment = (BottomFragment) getSupportFragmentManager().findFragmentById(R.id.bottomFragment);
        bottomFragment.refreshList(cursor);
    }

在传递给 BottomFragment 之前,这里也是一样的。

public void refreshList(Cursor cursor) {
        Log.i("RIGHTBEFOREREFRESH", DatabaseUtils.dumpCursorToString(cursor));
        String mEmployeeNumber = cursor.getString(1);
        Log.i("REFRESHLISTNUMBER", mEmployeeNumber);
        dbHandler = EmployeeDBHandler.getInstance(getContext());
        db = dbHandler.getReadableDatabase();
        mNewBottomCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " +
                /*"Employee_number" + "!=" + mStartingEmployeeID + " AND " +*/
                "Manager_employee_number" + "=" + mEmployeeNumber + " ORDER BY " +
                "Last_name" + " ASC", null);
        Log.i("THECURSOR ", DatabaseUtils.dumpCursorToString(mNewBottomCursor));
        BottomListCursorAdapter bottomListCursorAdapter = new BottomListCursorAdapter(getActivity(), cursor);
        bottomListCursorAdapter.swapCursor(mNewBottomCursor);
        mBottomListView.setAdapter(bottomListCursorAdapter);
    }
}

在此处为日志获取相同的游标,但在 REFRESHLISTNUMBER 日志语句中获取的employee_number 与游标不同。那是列表中的一个随机数。

不确定为什么没有正确传递光标。我在每一行都有一个详细信息按钮,它显示每行光标的信息,并且显示正确。

完成的顶部适配器

public class TopListCursorAdapter extends CursorAdapter {

    public interface TopListClickListener {
        void onTopListClick(Cursor cursor);
    }

    private TopListClickListener mCallback;

    public TopListCursorAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
        if(!(context instanceof TopListClickListener)) {
            throw new ClassCastException("Content must implement BottomListClickListener");
        }
        this.mCallback = (TopListClickListener) context;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.contact_cardview_top, parent, false);
    }

    @Override
    public void bindView(View view, final Context context, final Cursor cursor) {
        ViewHolder holder;
        holder = new ViewHolder();
        holder.tvFirstName = (TextView) view.findViewById(R.id.personFirstName);
        holder.tvLastName = (TextView) view.findViewById(R.id.personLastName);
        holder.tvTitle = (TextView) view.findViewById(R.id.personTitle);
        holder.mPeepPic = (ImageView) view.findViewById(R.id.person_photo);
        holder.mDetailsButton = (ImageButton) view.findViewById(R.id.fullDetailButton);
        holder.mTopCardView = (CardView) view.findViewById(R.id.mTopHomeScreenCV);

        String mFirstName = cursor.getString(cursor.getColumnIndexOrThrow("First_name"));
        String mLastName = cursor.getString(cursor.getColumnIndexOrThrow("Last_name"));
        String mPayrollTitle = cursor.getString(cursor.getColumnIndexOrThrow("Payroll_title"));
        String mThumbnail = cursor.getString(cursor.getColumnIndexOrThrow("ThumbnailData"));

        holder.tvFirstName.setText(mFirstName);
        holder.tvLastName.setText(mLastName);
        holder.tvTitle.setText(mPayrollTitle);

        if (mThumbnail != null) {
            byte[] imageAsBytes = Base64.decode(mThumbnail.getBytes(), Base64.DEFAULT);
            Bitmap parsedImage = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
            holder.mPeepPic.setImageBitmap(parsedImage);
        } else {
            holder.mPeepPic.setImageResource(R.drawable.img_place_holder_adapter);
        }


        final int position = cursor.getPosition();
        holder.mDetailsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cursor.moveToPosition(position);
                String mEmployeeNumber = cursor.getString(cursor.getColumnIndex("Employee_number"));
                String mFirstName = cursor.getString(cursor.getColumnIndex("First_name"));
                String mLastName = cursor.getString(cursor.getColumnIndex("Last_name"));
                String mTitle = cursor.getString(cursor.getColumnIndex("Payroll_title"));
                String mPic = cursor.getString(cursor.getColumnIndex("ThumbnailData"));
                String mEmail = cursor.getString(cursor.getColumnIndex("Email"));
                String mPhoneMobile = cursor.getString(cursor.getColumnIndex("Phone_mobile"));
                String mPhoneOffice = cursor.getString(cursor.getColumnIndex("Phone_office"));
                String mCostCenter = cursor.getString(cursor.getColumnIndex("Cost_center_id"));
                String mHasDirectReports = cursor.getString(cursor.getColumnIndex("Has_direct_reports"));
                String mManagerNumber = cursor.getString(cursor.getColumnIndex("Manager_employee_number"));
                Intent mIntent = new Intent(context, EmployeeFullInfo.class);
                mIntent.putExtra("Employee_number", mEmployeeNumber);
                mIntent.putExtra("First_name", mFirstName);
                mIntent.putExtra("Last_name", mLastName);
                mIntent.putExtra("Payroll_title", mTitle);
                mIntent.putExtra("ThumbnailData", mPic);
                mIntent.putExtra("Email", mEmail);
                mIntent.putExtra("Phone_mobile", mPhoneMobile);
                mIntent.putExtra("Phone_office", mPhoneOffice);
                mIntent.putExtra("Cost_center_id", mCostCenter);
                mIntent.putExtra("Has_direct_reports", mHasDirectReports);
                mIntent.putExtra("Manager_employee_number", mManagerNumber);
                mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                v.getContext().startActivity(mIntent);
            }
        });

        holder.mTopCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mCallback != null) {
                    mCallback.onTopListClick(cursor);
                    notifyDataSetChanged();
                    Log.i("FROMCLICK", DatabaseUtils.dumpCursorToString(cursor));
                }
            }
        });
    }

    public static class ViewHolder {
        TextView tvFirstName;
        TextView tvLastName;
        TextView tvTitle;
        ImageView mPeepPic;
        ImageButton mDetailsButton;
        CardView mTopCardView;
    }
}

public class TopFragment extends Fragment {
    Cursor mTopCursor;
    EmployeeDBHandler dbHandler;
    ListView mTopListView;
    TopListCursorAdapter mTopAdapter;
    MatrixCursor customCursor1;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_top_list, container, false);
        String table = "employees";
        dbHandler = EmployeeDBHandler.getInstance(getContext());
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        customCursor1 = new MatrixCursor(new String[]{"_id", "Employee_number", "First_name",
                "Last_name", "Payroll_title", "ThumbnailData", "Email", "Phone_mobile", "Phone_office", "Cost_center_id",
                "Has_direct_reports", "Manager_employee_number"});
        int mStartingEmployeeID = mStartingNumber;
        mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null);
        mTopListView = (ListView) view.findViewById(R.id.mTopList);
        mTopAdapter = new TopListCursorAdapter(getContext(), mTopCursor);
        mTopListView.setAdapter(mTopAdapter);
        return view;

    }

    public void update(Cursor cursor) {
        if (cursor.moveToNext()) {
            customCursor1.addRow(new Object[]{cursor.getInt(0), cursor.getString(1), cursor.getString(2),
                    cursor.getString(3), cursor.getString(6), cursor.getString(9), cursor.getString(8), cursor.getString(4),
                    cursor.getString(5), cursor.getString(10), cursor.getString(7), cursor.getString(11)});

            MergeCursor newCursor = new MergeCursor(new Cursor[]{mTopCursor, customCursor1});
            mTopAdapter.swapCursor(newCursor);
            mTopAdapter.notifyDataSetChanged();
            scrollMyListToBottom();
            customCursor1.close();
        } cursor.moveToNext();
    }

    private void scrollMyListToBottom() {
        mTopListView.post(new Runnable() {
            @Override
            public void run() {
                mTopListView.setSelection(mTopAdapter.getCount() - 1);
            }
        });
    }
}

也许我在 TopFragment 中的 MergeCursor 发生了一些事情,这会弄乱游标?如果是这样,不知道如何修复它或为什么会发生。

【问题讨论】:

    标签: android listview android-cursor


    【解决方案1】:

    通过在TopListCursorAdapter中mTopCardView的setClickListener添加一行代码修复。

    cursor.moveToPosition(position);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多