Search code examples
javaandroidsimplecursoradapter

Android SimpleCursorAdapter keep styling on scroll


I have a Simple Cursor Adapter which works fine and displays all the data. My listener changes the color on click:

listViewM.setOnItemClickListener(new AdapterView.OnItemClickListener() {
          @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    boolean exists = false;
                    TextView item = (TextView) view.findViewById(R.id.r_lv_name);
                    String selectedAnswer = item.getText().toString();
                    MultiSelection multiSelection = new MultiSelection((int) id, selectedAnswer);

                    for (MultiSelection mm : mMultiSelectionsArray) {
                        if (id == mm.getId()) {
                            mMultiSelectionsArray.remove(mm);
                            exists = true;
                            break;
                        } else {
                            exists = false;
                        }
                    }

                    if (!exists) {

                        mMultiSelectionsArray.add(multiSelection);
                        item.setTextColor(Color.parseColor("#2EFE2E"));
                    } else {

                        mMultiSelectionsArray.remove(multiSelection);
                        item.setTextColor(Color.parseColor("#000000"));
                    }

                }
            });

Now on scroll adapter is recycling views and marking new items as selected (by adding the color). I guess I need to keep status somehow and then apply it on view creation but after 3 days of looking I give up. Can anyone help please?


Solution

  • Try to use custom adapter, something like:

    public class CustomSimpleCursorAdapter extends SimpleCursorAdapter {
    
        public CustomSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
            super(context, layout, c, from, to, flags);
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return super.newView(context, cursor, parent);
        }
    
        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            super.bindView(view, context, cursor);
    
            //HERE you can set the correct color for each item
    
            TextView item = (TextView) view.findViewById(R.id.r_lv_name);
            boolean exists = //check is item is selected
            if (!exists) {
                 item.setTextColor(Color.parseColor("#2EFE2E"));
            } else {
                 item.setTextColor(Color.parseColor("#000000"));
            }
        }
    }