Android 继续合并光标

Android 继续合并光标,android,android-fragments,android-cursor,Android,Android Fragments,Android Cursor,我从底部列表中单击的行中取出光标,并将其与顶部的光标合并。它对第一个单击的行正常工作。但是,当我单击另一行时,它只是替换另一行,而不仅仅是将它们添加到一起。我不确定您是否可以或者如何迭代MergeCursor,使其保持添加到游标而不是替换它 public class TopFragment extends Fragment { public Cursor mTopCursor; EmployeeDBHandler dbHandler; ListView mTopListV

我从底部列表中单击的行中取出光标,并将其与顶部的光标合并。它对第一个单击的行正常工作。但是,当我单击另一行时,它只是替换另一行,而不仅仅是将它们添加到一起。我不确定您是否可以或者如何迭代MergeCursor,使其保持添加到游标而不是替换它

public class TopFragment extends Fragment {
    public Cursor mTopCursor;
    EmployeeDBHandler dbHandler;
    ListView mTopListView;


    @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";
        int mStartingEmployeeID = mStartingNumber;
        dbHandler = new EmployeeDBHandler(getContext());
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null);
        mTopListView = (ListView) view.findViewById(R.id.mTopList);
        TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), mTopCursor);
        mTopListView.setAdapter(topAdapter);
        return view;
    }


    public void update(Cursor cursor) {
        while (cursor.moveToNext()) {
            MergeCursor mergeCursor = new MergeCursor(new Cursor[]{cursor, mTopCursor});
            TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), mergeCursor);
            mTopListView.setAdapter(topAdapter);
        }
    }
}
我知道我总是将mTopCursor添加到merge中,所以它只是获取mTopCursor并与传递到update方法中的新游标合并。我不知道如何将两个游标合并在一起,然后将新游标与传递到update方法中的任何游标合并

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(1);
                String mEmail = cursor.getString(8);
                String mFirstName = cursor.getString(2);
                String mLastName = cursor.getString(3);
                String mPhoneMobile = cursor.getString(4);
                String mPhoneOffice = cursor.getString(5);
                String mCostCenter = cursor.getString(10);
                String mHasDirectReports = cursor.getString(7);
                String mTitle = cursor.getString(6);
                String mPic = cursor.getString(9);
                Intent mIntent = new Intent(context, EmployeeFullInfo.class);
                mIntent.putExtra("Employee_number", mEmployeeNumber);
                mIntent.putExtra("Email", mEmail);
                mIntent.putExtra("First_name", mFirstName);
                mIntent.putExtra("Last_name", mLastName);
                mIntent.putExtra("Phone_mobile", mPhoneMobile);
                mIntent.putExtra("Phone_office", mPhoneOffice);
                mIntent.putExtra("Cost_center_id", mCostCenter);
                mIntent.putExtra("Has_direct_reports", mHasDirectReports);
                mIntent.putExtra("Payroll_title", mTitle);
                mIntent.putExtra("ThumbnailData", mPic);
                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);
                }
            }
        });
    }

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


public class MainActivity extends AppCompatActivity implements BottomListCursorAdapter.BottomListClickListener,
        TopListCursorAdapter.TopListClickListener {
    private ProgressBar mProgressBar;
    EmployeeDBHandler dbHandler;
    private TopListCursorAdapter topAdapter;
    private BottomListCursorAdapter bottomAdapter;
    private ArrayList<Employee> mEmployee;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        dbHandler = new EmployeeDBHandler(getApplicationContext());
        mProgressBar.setVisibility(View.VISIBLE);
        getXMLData();

        //GUI for seeing android SQLite Database in Chrome Dev Tools
        Stetho.InitializerBuilder inBuilder = Stetho.newInitializerBuilder(this);
        inBuilder.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this));
        Stetho.Initializer in = inBuilder.build();
        Stetho.initialize(in);
    }

    public void getXMLData() {
        OkHttpClient client = getUnsafeOkHttpClient();
        Request request = new Request.Builder()
                .url(getString(R.string.API_FULL_URL))
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                final String responseData = response.body().string();
                final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
                final XMLPullParserHandler parserHandler = new XMLPullParserHandler();
                final ArrayList<Employee> employees = (ArrayList<Employee>) parserHandler.parse(stream);

                for (Employee e : employees) {
                    dbHandler.addEmployee(e);
                }

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mProgressBar.setVisibility(View.GONE);
                        displayTopList();
                        displayBottomList();
                    }
                });
            }
        });
    }

    public void displayTopList() {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.topFragment, new TopFragment());
        fragmentTransaction.commit();
    }

    public void displayBottomList() {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.bottomFragment, new BottomFragment());
        fragmentTransaction.commit();
    }

    @Override
    public void onBottomListClick(Employee e) {
        dbHandler.addEmployee(e);
        Log.i("EMPLOYEE", e.toString());
        TopFragment topFragment = (TopFragment) getSupportFragmentManager().findFragmentById(R.id.topFragment);
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        final Cursor clickedEmployee = db.rawQuery("SELECT * FROM " + "employees" + " WHERE " +
                "Employee_number" + "=" + e.getEmployee_number(), null);
        // change the adapter's Cursor
        topFragment.update(clickedEmployee);
    }

    @Override
    public void onTopListClick(Cursor cursor) {
        do{
            BottomFragment bottomFragment = (BottomFragment) getSupportFragmentManager().findFragmentById(R.id.bottomFragment);
            bottomFragment.refreshList(cursor);
        } while (cursor.moveToNext());
    }
}

我已经做了一个非常基本的项目,只是为了满足您的要求,请找到下面的回购链接:


似乎有更好的解决方案可以解决您的问题,您能告诉我您想要实现什么吗?我有一个ListView,当单击它时,它会将该行光标发送到顶部ListView,以在那里的ListView中显示该行。当用户单击底部的ListView时,顶部的ListView应继续添加这些行单击。@Deepesh不确定是否有其他方法可以让我这样做,因为这正是应用程序需要的功能。我只知道如何将光标从一个listview传递到另一个listview,因此我假设我只需要将光标添加到顶部片段中,以继续构建listview。我知道我的问题是什么,只是不知道如何纠正它。这是mTopCursor。我一直在使用它,而不是下一次单击底部列表行时的最新合并光标。在下面添加了我的答案,请查看..customCursor2.addRownew Object[]{I,Item Desc+l};这就是将listView2单击添加到listView1的原因吗?在大多数情况下,我看不到正在发生什么,只是没有100%清楚地知道如何在我的应用程序中做到这一点。我无法重写这个应用程序,因为这将包括重做网络调用、数据库、xml解析。只是没有时间。或者在自定义游标适配器中可以执行onClickListener事件吗?我有一个用于底部列表的CursorAdapter,它将光标传递给MainActivity,然后将光标传递给我执行MergeCursor的TopFragment。我理解这一点,但我不能使用SimpleCursorAdapter来显示每一行以及从web服务返回的数据。因此,我不知道如何在我自己的代码中实现它,从而获得相同的结果。我制作SimpleCrsorAdapter只是为了向您展示这个示例,它可以是任何其他适配器。您可以做的是,在底部listview项目上更新顶部listview适配器,并使用基础数据单击。您可以在另一个适配器中设置listview适配器吗?
public class TopFragment extends Fragment {
    public Cursor mTopCursor;
    EmployeeDBHandler dbHandler;
    ListView mTopListView;
    public static MatrixCursor customCursor1;
    private int mStartingEmployeeID = mStartingNumber;
    int flag = 0;

    @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";

        customCursor1 = new MatrixCursor(new String[]{"_id", "Employee_number", "First_name",
                "Last_name", "Payroll_title", "ThumbnailData"});
        dbHandler = new EmployeeDBHandler(getContext());
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null);
        mTopListView = (ListView) view.findViewById(R.id.mTopList);
        TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), mTopCursor);
        mTopListView.setAdapter(topAdapter);
        return view;
    }

    public void update(Cursor cursor) {
        if (cursor.moveToNext() && cursor.getCount() >= 1) {
            do {
                customCursor1.addRow(new Object[]{cursor.getInt(0), cursor.getString(1), cursor.getString(2),
                        cursor.getString(3), cursor.getString(6), cursor.getString(9)});
                if (flag == 0) {
                    customCursor1.addRow(new Object[]{mTopCursor.getInt(0), mTopCursor.getString(1), mTopCursor.getString(2),
                            mTopCursor.getString(3), mTopCursor.getString(6), mTopCursor.getString(9)});
                    flag++;
                }
                TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), customCursor1);
                mTopListView.setAdapter(topAdapter);
            } while (cursor.moveToNext());
        }
    }
}