user2011302
user2011302

Reputation: 391

listview doesn't refresh in android fragment with notifyDataSetChanged()

In my android application, I am unable to solve this issue since two months even after trying so many similar solutions found at Stack Overflow. I am populating the listview with an ArrayAdapter. When an item of listview is pressed for long, a dialog box appears and asks for confirmation. After confirmation, the selected item gets deleted from the array-list but in listview last item seems to be removed. When you close the fragment and come back to it, you see the correct items but not immediately after closing the alert dialog.

Can anyone please help? Thanks!

Adapter Class

public class DuasListAdapter extends ArrayAdapter<String>{

// class variables
    private final Context context;// to save context
    private final List<String> duas;// to save list of stores
    LayoutInflater inflater;// so save layout inflater for the view

    public DuasListAdapter(Context ctx, List<String> duasList) {

        super(ctx, R.layout.adapter_list_duas, duasList);
        context = ctx;// save context
        duas = duasList;// save list of stores
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);// save inflater layout
    }


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

        ViewHolder holder;


convertView=inflater.inflate(R.layout.adapter_list_duas, parent, false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
        holder.duaIndex = position;

if(SingletonClass.duasAra.get(holder.duaIndex)!=""){
            holder.tv_dua_arabic.setText(SingletonClass.duasAra.get(holder.duaIndex));
        }
        else{

                if(keyUrdSel && !keyEngSel)
                    holder.tv_dua_arabic.setText(SingletonClass.duasTitUrd.get(holder.duaIndex));
                else
                    holder.tv_dua_arabic.setText(SingletonClass.duasTitEng.get(holder.duaIndex));


            }
        holder.tv_dua_no.setText("  ("+ (holder.duaIndex+1));

return convertView;

}
static class ViewHolder {

         int duaIndex;
        LinearLayout background;// background to display color for read and unread messages
        ImageView iv_duatype;
        TextView tv_dua_arabic;// title of message
        TextView tv_dua_ref;// message by and message created on
        TextView tv_dua_no;

        /**
         * @description constructor to save context and list of stores views
         * @param v to refer the view
         * @return
         */
        public ViewHolder(View v) {
            // initialize their respective views
            background = (LinearLayout) v.findViewById(R.id.ll_duas_list);
            iv_duatype = (ImageView) v.findViewById(R.id.iv_duatype);
            tv_dua_arabic = (TextView) v.findViewById(R.id.tv_dua_arabic);
            tv_dua_no = (TextView) v.findViewById(R.id.dua_no);

        }
}

Fragment Class

public class DuasListFragment extends Fragment  {
    Context context;

    LinearLayout ll_back_duas_list_header;
    TextView ll_back_duas_list_header_title;
    ListView lvDuaas;
public  DuasListAdapter duasAdapter;
int intListViewItemPosition = -1;
 ArrayList<String> duas;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        context = inflater.getContext();
        View view = inflater.inflate(R.layout.fragment_list_duas, container, false);

    // TODO Auto-generated method stub


        return view;
    }


@Override
    public void onActivityCreated(Bundle savedInstanceState) {


        ll_back_duas_list_header = (LinearLayout) getActivity().findViewById(R.id.ll_back_duas_list_header);
        ll_back_duas_list_header_title = (TextView) getActivity().findViewById(R.id.ll_back_duas_list_header_title);
        lvDuaas = (ListView) getActivity().findViewById(R.id.lv_duas);



        String verses = new SharedPreferencesSupplication().read(SingletonClass.keyListOfVerses, "a1");
        String[] versesList = verses.split(",");
        duas = new ArrayList<String>();
        for (int i = 0; i < versesList.length; i++) {
            if (versesList[i].length() > 0)
                duas.add(versesList[i]);
        }

        duasAdapter = new DuasListAdapter(context, duas);
        lvDuaas.setAdapter(duasAdapter);

    lvDuaas.setOnItemLongClickListener(new OnItemLongClickListener() {

                @Override
                public boolean onItemLongClick(final AdapterView<?> parent,
                        View view, final int position, long id) {
                    // TODO Auto-generated method stub
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which) {
                                case DialogInterface.BUTTON_POSITIVE:




               duasAdapter = (DuasListAdapter) parent.getAdapter();
                    duas.remove(position);
                     duasAdapter.notifyDataSetChanged();



               ((MainActivity) context).removeItemFromList(position);

                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    // No button clicked
                                    break;
                            }
                        }
                    };


                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                    builder.setMessage("Delete Dua from Favorites?").setPositiveButton("Yes", dialogClickListener).setNegativeButton("No", dialogClickListener).show();


        return true;
                }
            }); 




        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        // duasAdapter.clear();
         //duasAdapter.addAll(duas);

            duasAdapter.notifyDataSetChanged();

    }

}

Upvotes: 0

Views: 401

Answers (1)

Suhas Patil
Suhas Patil

Reputation: 131

I also faced same problem with notifydatasetchanged method.

My problem was List that I had attached to adapter was getting updated but notifydatasetchanged method was not working.

If your ListView is designed to show moderate number of items in it,instead of calling notifydatasetchanged you can recreate your adapter.

It worked for me.I wasusing BaseAdapter.

Upvotes: 1

Related Questions