Reputation: 2731
I've facing a problem to refresh listview
after delete item from database.
Problem is that when i'm call notifyDataSetChanged()
it return a listView
with removing last index element from list instead of specific index every time (eg i want to delete 2nd index item then after deleting item listView
show with removing last item every time but actual list and database contain right value).
I cant understand this problem why notifyDataSetChanged()
method behave like this and what is solution for it.
Code inside BaseAdapter class:
public class CustomReminderAdapter extends BaseAdapter {
private Context context;
private List<ReminderData> datalist;
Viewholder holder;
private AddReminderHelperDao dao;
public CustomReminderAdapter(Context context,
List<ReminderData> datalist) {
super();
this.context = context;
this.datalist = datalist;
}
@Override
public int getCount() {
return datalist.size();
}
@Override
public Object getItem(int position) {
return datalist.get(position);
}
@Override
public long getItemId(int position) {
return datalist.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate( R.layout.custom_list_item, null);
holder = new Viewholder();
holder.delete = (LinearLayout) convertView .findViewById(R.id.deletelayout);
holder.delete.setTag(position);
convertView.setTag(holder);
} else {
holder = (Viewholder) convertView.getTag();
}
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// datalist contain all values from database
int positionToRemove = (int)v.getTag();
int id= datalist.get(positionToRemove).getId();
try {
// dao method call for delete from database
dao.deleteReminder(id);
datalist.remove(positionToRemove);
notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
} finally {
dao.close();
}
}
});
}
}
ViewHolder class:
private class Viewholder {
private TextView titleTextView, timeDetail;
private ImageView remindertypeImageView,conformimage;
private ImageView sendwish;
private LinearLayout topsideLayout, bglayout, bottomsideLayout,
bottomrightstrip, topLayout, editLayout, snoozedlayout;
private LinearLayout delete, conform, edit;
}
Please help me.
Upvotes: 0
Views: 133
Reputation: 25830
Its very difficult guessing without knowing your full class file. However, you should definitely follow viewholder pattern and change your getview method like below :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
final Viewholder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_list_item, parent, false);
holder = new Viewholder();
// Initializa your all finviewbyIds here
//Set tag of position
holder.delete.setTag(position);
// Set your holder to convertview for reusing it.
convertView.setTag(holder);
} else {
holder = (Viewholder) convertView.getTag();
}
//Do your business logic here
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// datalist contain all values from database
int positionToRemove = (int) v.getTag();
int id = datalist.get(positionToRemove).getId();
try {
// dao method call for delete from database
dao.deleteReminder(id);
datalist.remove(positionToRemove);
notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
} finally {
dao.close();
}
}
});
}
Change
convertView = mInflater.inflate( R.layout.custom_list_item, null);
To
convertView = mInflater.inflate( R.layout.custom_list_item, parent,false);
Also, update getItemId()
to
@Override
public long getItemId(int position) {
return position;
}
Edit :
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// datalist contain all values from database
int positionToRemove = (int)v.getTag();
int id= datalist.get(positionToRemove).getId();
try {
// dao method call for delete from database
dao.deleteReminder(id);
// Directly pass the object instead of passing any positions
datalist.remove(datalist.get(positionToRemove));
notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
} finally {
dao.close();
}
}
});
Upvotes: 1