'ListView Item Duplicated when Save or Reload

I am getting listView items duplicated after adding items and also when EDIT or DELETE menu item got selected, but when i re-open the app, items are not duplicated.

Posting some codes below:

SQLiteManager.java

package com.example.sqlitetutorial;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;

public class SQLiteManager extends SQLiteOpenHelper {
    private static SQLiteManager sqLiteManager;

    private static final String DATABASE_NAME = "MemberDB";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "Member";
    private static final String COUNTER = "Counter";

    private static final String ID_FIELD = "id";
    private static final String LNAME_FIELD = "lname";
    private static final String FNAME_FIELD = "fname";
    private static final String MNAME_FIELD = "mname";
    private static final String DELETED_FIELD = "deleted";

    @SuppressLint("SimpleDateFormat")
    private static final DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");

    public SQLiteManager(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public static SQLiteManager instanceOfDatabase(Context context)
    {
        if(sqLiteManager == null)
            sqLiteManager = new SQLiteManager(context);

        return sqLiteManager;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase)
    {
        StringBuilder sql;
        sql = new StringBuilder()
                .append("CREATE TABLE ")
                .append(TABLE_NAME)
                .append("(")
                .append(COUNTER)
                .append(" INTEGER PRIMARY KEY AUTOINCREMENT, ")
                .append(ID_FIELD)
                .append(" INT, ")
                .append(LNAME_FIELD)
                .append(" TEXT, ")
                .append(FNAME_FIELD)
                .append(" TEXT, ")
                .append(MNAME_FIELD)
                .append(" TEXT, ")
                .append(DELETED_FIELD)
                .append(" TEXT)");
        

        sqLiteDatabase.execSQL(sql.toString());
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion)
    {
    }

    public void addMemberToDatabase(Member member)
    {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(ID_FIELD, member.getId());
        contentValues.put(LNAME_FIELD, member.getLName());
        contentValues.put(FNAME_FIELD, member.getFName());
        contentValues.put(MNAME_FIELD, member.getMName());
        contentValues.put(DELETED_FIELD, getStringFromDate(member.getDeleted()));

        sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
    }

    public void populateMemberListArray()
    {
        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();

        try (Cursor result = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_NAME, null))
        {
            if(result.getCount() != 0)
            {
                while (result.moveToNext())
                {
                    int id = result.getInt(1);
                    String lname = result.getString(2);
                    String fname = result.getString(3);
                    String mname = result.getString(4);
                    String stringDeleted = result.getString(5);
                    Date deleted = getDateFromString(stringDeleted);
                    Member member = new Member(id,lname,fname,mname,deleted);
                    Member.memberArrayList.add(member);
                }
            }
        }
    }

    public void updateMemberInDB(Member member)
    {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(ID_FIELD, member.getId());
        contentValues.put(LNAME_FIELD, member.getLName());
        contentValues.put(FNAME_FIELD, member.getFName());
        contentValues.put(MNAME_FIELD, member.getMName());
        contentValues.put(DELETED_FIELD, getStringFromDate(member.getDeleted()));

        sqLiteDatabase.update(TABLE_NAME, contentValues, ID_FIELD + " =? ", new String[]{String.valueOf(member.getId())});
    }

    private String getStringFromDate(Date date)
    {
        if(date == null)
            return null;
        return dateFormat.format(date);
    }

    private Date getDateFromString(String string)
    {
        try
        {
            return dateFormat.parse(string);
        }
        catch (ParseException | NullPointerException e)
        {
            return null;
        }
    }
}

MemberAdapter.java

package com.example.sqlitetutorial;



import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.List;

public class MemberAdapter extends ArrayAdapter<Member> {
    public MemberAdapter(Context context, List<Member> members)
    {
        super(context, 0, members);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
    {


        Member member = getItem(position);
        if(convertView == null)
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.member_cell, parent, false);

        TextView lname = convertView.findViewById(R.id.cellLName);
        TextView fname = convertView.findViewById(R.id.cellFName);
        TextView mname = convertView.findViewById(R.id.cellMName);

        lname.setText(member.getLName());
        fname.setText(member.getFName());
        mname.setText(member.getMName());

        return convertView;
    }
}

Member.java

package com.example.sqlitetutorial;

import java.util.ArrayList;
import java.util.Date;

public class Member {

        public static ArrayList<Member> memberArrayList = new ArrayList<>();
        public static String MEMBER_EDIT_EXTRA =  "memberEdit";

        private int id;
        private String LName;
        private String FName;
        private String MName;
        private Date deleted;

    public Member(int id, String LName, String FName, String MName, Date deleted)
        {
            this.id = id;
            this.LName = LName;
            this.FName = FName;
            this.MName = MName;
            this.deleted = deleted;
        }

    public Member(int id, String LName, String FName, String MName)
        {
            this.id = id;
            this.LName = LName;
            this.FName = FName;
            this.MName = MName;
            deleted = null;
        }

        public static Member getMemberForID(int passedMemberID)
        {
            for (Member member : memberArrayList)
            {
                if(member.getId() == passedMemberID)
                    return member;
            }

            return null;
        }

        public static ArrayList<Member> nonDeletedMembers()
        {
            ArrayList<Member> nonDeleted = new ArrayList<>();
            for(Member member : memberArrayList)
            {
                if(member.getDeleted() == null)
                    nonDeleted.add(member);
            }

            return nonDeleted;
        }

        public int getId()
        {
            return id;
        }

        public void setId(int id)
        {
            this.id = id;
        }

        public String getLName()
        {
            return LName;
        }

        public void setLName(String LName)
        {
            this.LName = LName;
        }

        public String getFName()
        {
            return FName;
        }

        public void setFName(String FName)
        {
            this.FName = FName;
        }

        public String getMName()
        {
            return MName;
        }

        public void setMName(String MName)
        {
            this.MName = MName;
        }


        public Date getDeleted()
        {
            return deleted;
        }

        public void setDeleted(Date deleted)
        {
            this.deleted = deleted;
        }
}

MemberDetailActivity.java/Insert Data Class

package com.example.sqlitetutorial;


import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;


public class MemberDetailActivity extends AppCompatActivity {
    private EditText lnameEditText, fnameEditText, mnameEditText;
    private Member selectedMember;
    String FNameHolder, MNameHolder, LNameHolder;
    Boolean EditTextEmptyHold;

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


    }
    private void initWidgets()
    {
        lnameEditText = findViewById(R.id.LNameEditText);
        fnameEditText = findViewById(R.id.FNameEditText);
        mnameEditText = findViewById(R.id.MNameEditText);
    }



    public void saveMember(View view)
    {
        CheckEditTextStatus();
        if(EditTextEmptyHold == true) {

            SQLiteManager sqLiteManager = SQLiteManager.instanceOfDatabase(this);
            String lname = String.valueOf(lnameEditText.getText());
            String fname = String.valueOf(fnameEditText.getText());
            String mname = String.valueOf(mnameEditText.getText());

            if (selectedMember == null) {
                int id = Member.memberArrayList.size();
                Member newMember = new Member(id, lname, fname, mname);
                Member.memberArrayList.add(newMember);
                sqLiteManager.addMemberToDatabase(newMember);
            } else {
                selectedMember.setLName(lname);
                selectedMember.setFName(fname);
                selectedMember.setMName(mname);
                sqLiteManager.updateMemberInDB(selectedMember);
            }

            Intent newMemberIntent = new Intent(this, ActivityEditViewListitem.class);
            startActivity(newMemberIntent);
        }

        else{
            Toast.makeText(MemberDetailActivity.this,"Please Fill All The Required Fields.", Toast.LENGTH_LONG).show();
        }
    }
    public void CheckEditTextStatus(){

        FNameHolder = fnameEditText.getText().toString() ;
        MNameHolder = mnameEditText.getText().toString();
        LNameHolder = lnameEditText.getText().toString();

        if(TextUtils.isEmpty(FNameHolder) || TextUtils.isEmpty(MNameHolder) || TextUtils.isEmpty(LNameHolder)){

            EditTextEmptyHold = false ;

        }
        else {

            EditTextEmptyHold = true ;
        }
    }


}

EditMemberDetailActivity/Update Data Class

package com.example.sqlitetutorial;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

public class ActivityEditViewListitem extends AppCompatActivity {

    DrawerLayout drawerLayout;
    private ListView memberListView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editview_listitem);
        drawerLayout = findViewById(R.id.drawer_layout);
        initWidgets();
        loadFromDBToMemory();
        setMemberAdapter();
        setOnClickListener();
    }

    public void ClickMenu(View view){
        openDrawer(drawerLayout);

    }
    public static void openDrawer(DrawerLayout drawerLayout){

        drawerLayout.openDrawer(GravityCompat.START);
    }

    public void ClickLogo(View view){
        closeDrawer(drawerLayout);

    }
    public static void closeDrawer(DrawerLayout drawerLayout){
        if (drawerLayout.isDrawerOpen(GravityCompat.START)){
            drawerLayout.closeDrawer(GravityCompat.START);
        }
    }

    public void ClickAdd(View view){
        Intent newMemberIntent = new Intent(this, MemberDetailActivity.class);
        startActivity(newMemberIntent);
    }

    public void ClickEdit(View view){
        closeDrawer(drawerLayout);
        finish();
        Intent newMemberIntent = new Intent(this, ActivityEditViewListitem.class);
        startActivity(newMemberIntent);

    }
    public void ClickDelete(View view){
        closeDrawer(drawerLayout);
        finish();
        Intent newMemberIntent = new Intent(this, ActivityDeleteViewListitem.class);
        startActivity(newMemberIntent);
    }




    private void initWidgets()
    {
        memberListView = findViewById(R.id.memberListView);

    }

    private void loadFromDBToMemory()
    {
        SQLiteManager sqLiteManager = SQLiteManager.instanceOfDatabase(this);
        sqLiteManager.populateMemberListArray();
    }

    private void setMemberAdapter()
    {
        MemberAdapter memberAdapter = new MemberAdapter(getApplicationContext(), Member.nonDeletedMembers());
        memberListView.setAdapter(memberAdapter);

    }


    private void setOnClickListener()
    {
        memberListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l)
            {
                Member selectedMember = (Member) memberListView.getItemAtPosition(position);
                Intent editMemberIntent = new Intent(getApplicationContext(), EditMemberDetailActivity.class);
                editMemberIntent.putExtra(Member.MEMBER_EDIT_EXTRA, selectedMember.getId());
                startActivity(editMemberIntent);
            }
        });
    }



    @Override
    protected void onResume()
    {
        super.onResume();
        setMemberAdapter();
    }
}

ActivityEditViewListitem/Showing of listitem class

package com.example.sqlitetutorial;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

public class ActivityEditViewListitem extends AppCompatActivity {

    DrawerLayout drawerLayout;
    private ListView memberListView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editview_listitem);
        drawerLayout = findViewById(R.id.drawer_layout);
        initWidgets();
        loadFromDBToMemory();
        setMemberAdapter();
        setOnClickListener();
    }

    public void ClickMenu(View view){
        openDrawer(drawerLayout);

    }
    public static void openDrawer(DrawerLayout drawerLayout){

        drawerLayout.openDrawer(GravityCompat.START);
    }

    public void ClickLogo(View view){
        closeDrawer(drawerLayout);

    }
    public static void closeDrawer(DrawerLayout drawerLayout){
        if (drawerLayout.isDrawerOpen(GravityCompat.START)){
            drawerLayout.closeDrawer(GravityCompat.START);
        }
    }

    public void ClickAdd(View view){
        Intent newMemberIntent = new Intent(this, MemberDetailActivity.class);
        startActivity(newMemberIntent);
    }

    public void ClickEdit(View view){
        closeDrawer(drawerLayout);
        finish();
        Intent newMemberIntent = new Intent(this, ActivityEditViewListitem.class);
        startActivity(newMemberIntent);

    }
    public void ClickDelete(View view){
        closeDrawer(drawerLayout);
        finish();
        Intent newMemberIntent = new Intent(this, ActivityDeleteViewListitem.class);
        startActivity(newMemberIntent);
    }




    private void initWidgets()
    {
        memberListView = findViewById(R.id.memberListView);

    }

    private void loadFromDBToMemory()
    {
        SQLiteManager sqLiteManager = SQLiteManager.instanceOfDatabase(this);
        sqLiteManager.populateMemberListArray();
    }

    private void setMemberAdapter()
    {
        MemberAdapter memberAdapter = new MemberAdapter(getApplicationContext(), Member.nonDeletedMembers());
        memberListView.setAdapter(memberAdapter);

    }


    private void setOnClickListener()
    {
        memberListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l)
            {
                Member selectedMember = (Member) memberListView.getItemAtPosition(position);
                Intent editMemberIntent = new Intent(getApplicationContext(), EditMemberDetailActivity.class);
                editMemberIntent.putExtra(Member.MEMBER_EDIT_EXTRA, selectedMember.getId());
                startActivity(editMemberIntent);
            }
        });
    }



    @Override
    protected void onResume()
    {
        super.onResume();
        setMemberAdapter();
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source