Garg
Garg

Reputation: 2731

listview not refresh properly after call notifyDataSetChanged()

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

Answers (1)

Bhavesh Patadiya
Bhavesh Patadiya

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

Related Questions