Sunday, 29 December 2019

Android read Firebase CheckBox acting weird

I have the following in the project:

  1. MainActivity
  2. FirebaseHelper
  3. CustomAdapter
  4. Person
  5. one_line_list_item.xml

MainActivity Class

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = this;
        mListView = (ListView) findViewById(R.id.list_view);
        searchView = (SearchView) findViewById(R.id.search);
        //searchView.setIconifiedByDefault(true);
        searchView.setSubmitButtonEnabled(true);
        //initialize firebase database
        db = FirebaseDatabase.getInstance().getReference();
        helper = new FirebaseHelper(db, this, mListView);

        adapter = new CustomAdapter(context, helper.people);

FirebaseHelper Class

DatabaseReference db;
Boolean saved;
ArrayList<Person> people = new ArrayList<>();
ListView mListView;
Context c;
CustomAdapter adapter;

public FirebaseHelper(DatabaseReference db, Context context, ListView mListView) {
    this.db = db;
    this.c = context;
    this.mListView = mListView;
    this.retrieve();
}

public ArrayList<Person> retrieve() {
    db.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            people.clear();
            if (dataSnapshot.exists() && dataSnapshot.getChildrenCount() > 0) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    //Now get Person Objects and populate our arraylist.
                    Person person = ds.getValue(Person.class);
                    people.add(person);
                }
                adapter = new CustomAdapter(c, people);
                mListView.setAdapter(adapter);

                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        mListView.smoothScrollToPosition(people.size());
                        mListView.smoothScrollToPosition(people.indexOf(0));
                    }
                });
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d("mTAG", databaseError.getMessage());
            Toast.makeText(c, "ERROR " + databaseError.getMessage(), Toast.LENGTH_LONG).show();

        }
    });

    return people;
}

CustomAdapter Class

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(c).inflate(R.layout.one_line_list_item, parent, false);
        }

        CheckBox cbId = convertView.findViewById(R.id.cbid);
        TextView nameTextView = convertView.findViewById(R.id.name);
        TextView dateTextView = convertView.findViewById(R.id.date);
        TextView descriptionTextView = convertView.findViewById(R.id.description);

        final Person s = (Person) this.getItem(position);

        Log.i(TAG, "" + s.get_id());

        nameTextView.setText(s.getName());
        descriptionTextView.setText(s.getDetails());
        dateTextView.setText(s.getDay() + " " + s.getMonth() + " " + s.getYear());

        if (cbId != null ) {
            cbId.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Toast.makeText(c, "" + s.get_id(), Toast.LENGTH_SHORT).show();
                }
            });

            cbId.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    // update your model (or other business logic) based on isChecked
                    int selected_id = s.get_id();
                    if (selected.contains(selected_id) && !isChecked) {
                        selected.remove(selected.indexOf(selected_id));
                        Toast.makeText(c, "REMOVED: " + selected_id + " - " + isChecked, Toast.LENGTH_SHORT).show();
                    } else {
                        selected.add(selected_id);
                        Toast.makeText(c, "ADDED: " + selected_id + " - " + isChecked, Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
        //ONITECLICK
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(c, s.getName(), Toast.LENGTH_SHORT).show();
            }
        });

        convertView.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(c, " -- onLongClick -- " + s.get_id() + " - " + s.getName(), Toast.LENGTH_SHORT).show();
                return false;
            }
        });



        return convertView;
    }

Person Class

public class Person {

    private String name;
    private String day;
    private String month;
    private String year;
    private String details;
    private int _id;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getDay() { return day; }
    public void setDay(String day) { this.day = day; }
    public String getMonth() { return month; }
    public void setMonth(String month) { this.month = month; }
    public String getYear() { return year; }
    public void setYear(String year) { this.year = year; }
    public String getDetails() { return details; }
    public void setDetails(String details) { this.details = details; }
    public int get_id() { return _id; }
    public void set_id(int _id) { this._id = _id; }
    public Person() { }
}

one_line_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="6dp"
    android:background="?android:attr/activatedBackgroundIndicator">

    <CheckBox
        android:id="@+id/cbid"
        android:layout_width="wrap_content"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="6dp"
        android:layout_marginLeft="26dp"
        android:layout_marginEnd="6dip"
        android:layout_marginRight="12dp"
        android:text="" />

    <TextView
        android:id="@+id/name"
        android:layout_width="fill_parent"
        android:layout_height="26dp"
        android:layout_toStartOf="@id/cbid"
        android:layout_alignParentTop="true"
        android:lineHeight="18dp"
        android:maxLines="1"
        android:text="@string/name"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/date"
        android:layout_width="fill_parent"
        android:layout_height="18dp"
        android:layout_below="@+id/name"
        android:layout_toStartOf="@id/cbid"
        android:lineHeight="12dp"
        android:maxLines="1"
        android:text="@string/date"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/description"
        android:layout_width="fill_parent"
        android:layout_height="18dp"
        android:layout_below="@id/date"
        android:layout_toStartOf="@id/cbid"
        android:lineHeight="18dp"
        android:maxLines="1"
        android:text="@string/additional_description"
        android:textSize="16sp" />

</RelativeLayout>

Sorry for this long code, I put only the necessary parts of each Class to make it as clear as possible...

The issue is:
When clicking any checkbox on the list, it seems to be checking also others that are hidden from the view.
I tried to isolate the issue as possible but can't figure this out...
Any ideas why it would be checking also other items that are hidden from view??
They are checked in intervals of 8 and also unchecked when any of the is unchecked....

UPDATE: Tried implementing this in MainActivity:

mListView.setLongClickable(true);
selected = new ArrayList<>();
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

        // int selected_id = s.get_id();
        int selected_id = position;
        if (selected.contains(selected_id)) {
            selected.remove(selected.indexOf(selected_id));
            Log.i(TAG, " -- remove -- " + parent.getChildAt(selected_id));
            parent.getChildAt(selected_id).setBackgroundColor(ContextCompat.getColor(context, R.color.default_color));
            //view.setBackgroundColor(ContextCompat.getColor(context, R.color.default_color));
            //view.setSelected(false);
            Toast.makeText(context, "MainAct REMOVED: " + selected_id + " - " , Toast.LENGTH_SHORT).show();
        } else {
            selected.add(selected_id);
            parent.getChildAt(selected_id).setBackgroundColor(ContextCompat.getColor(context, R.color.selected_color));
            Log.i(TAG, " -- add -- " + parent.getChildAt(selected_id));
            //view.setBackgroundColor(ContextCompat.getColor(context, R.color.selected_color));
            //view.setSelected(true);
            Toast.makeText(context, "MainAct ADDED: " + selected_id + " - " , Toast.LENGTH_SHORT).show();
        }
        return true;
    }
});

Still no go...:-(



from Android read Firebase CheckBox acting weird

No comments:

Post a Comment