'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 |
|---|
