Search code examples
androidlistviewandroid-cursoradapter

Pass onClick from CursorAdapter to another CursorAdapter


I have 2 ListViews. One above another. When a user clicks a row from the bottomList I am hitting a web service and creating a new cursor and repopulating the bottomList. At the same time, I want to take the clicked row and place it into the TopListView. I tried to pass an Intent to from the cursorAdapter to the MainActivity but that just repopulates the bottomListView with the same values that were there. Doesn't even make the call to the web service. Nothing happens to the TopListView.

Is it possible to pass the position of the onClick from bottomCursorAdapter to the topCursorAdapter? Or some variable like employee_number that way i can query it in the TopAdapter and swapCursor? If so, not sure how to swap cursor as there is no way to tell if someone clicked the bottomListView in the topListView.

My TopList method

public void displayTopList() {
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null);
        ListView mTopListView = (ListView) findViewById(R.id.mTopList);
        TopListCursorAdapter topAdapter = new TopListCursorAdapter(this, mTopCursor);
        mTopListView.setAdapter(topAdapter);
    }

Method I created to get the data from adapter to show toast

public void onRowClick(String mEmployeeNumber, String mFirstName) {
        Toast.makeText(getApplicationContext(), "SEND TO TOP LIST " + mEmployeeNumber + " " + mFirstName, Toast.LENGTH_LONG).show();
    }

My TopAdapter that I am trying to add the onRowClick.

public class TopListCursorAdapter extends CursorAdapter {
    public TopListCursorAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.contact_cardview_layout, 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.mCardView = (CardView) view.findViewById(R.id.home_screen_cardView);

        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);
            }
        });
    }

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

Solution

  • If I understand correctly, you want to have the code know when a click event happens in one adapter, and then send some data to the other one.

    In that case, you can simply define an interface that bridges the "communication" between adapters through the Activity class that contains both.

    For example, here is your adapter with an interface defined. It gets activated when you click the button.

    public class TopListCursorAdapter extends CursorAdapter {
    
        public interface TopListClickListener {
            void onTopListClick(int position); // Can add more parameters here
        }
    
        private TopListClickListener callback;
    
        public TopListCursorAdapter(Context context, Cursor cursor) {
            super(context, cursor, 0);
            if (!(context instanceof TopListClickListener)) {
                throw new ClassCastException("Context must implement TopListClickListener");
            }
            this.callback = (TopListClickListener) context;
        }
    
        ...
    
            holder.mDetailsButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    cursor.moveToPosition(position);
                    ...
                    if (callback != null) {
                        callback.onTopListClick(position); // Can pass more parameters here
                    }
    

    And in the Activity, you can implement that interface (aka your callback)

    public class MainActivity extends AppCompatActivity 
        implements TopListCursorAdapter.TopListClickListener // see here
    
        // private ... topAdapter, bottomAdapter;
    
        @Override
        public void onTopListClick(int position) {
            // Make sure parameters match the interface ^^^
    
    
            // TODO: Get data from topAdapter
            // TODO: database update or arraylist.add to change bottomAdapter
            bottomAdapter.notifyDataSetChanged(); // Update the UI
        }
    
        // Other code can remain the same