Последний элемент ListView, похоже, удален при notifyDataSetChanged ()

#android #listview #android-fragments #sharedpreferences #notifydatasetchanged

#Android #listview #android-фрагменты #sharedpreferences #notifydatasetchanged

Вопрос:

В моем приложении для Android у меня есть адаптер массива (для заполнения listview) и фрагмент, содержащий ListView. Данные в listview извлекаются с использованием общих настроек. Проблема в том, что когда какой-либо элемент listview выбирается для удаления, кажется, что каждый раз удаляется последний элемент.

Например, если в списке всего 5 элементов, и вы решаете удалить 2-й элемент после нажатия и удержания. После удаления кажется, что 5-й элемент в списке удален, если вы не нажмете кнопку «Назад», а затем вернетесь к тому же фрагменту, тогда вы увидите правильные элементы, присутствующие в listview. ListView не обновляется должным образом после немедленного закрытия диалогового окна, вам нужно вернуться к фрагменту.

Пожалуйста, помогите, я безуспешно пытался исправить это в течение нескольких месяцев. Большое спасибо!

Класс Adpater:

      public class DuasListAdapter extends ArrayAdapter<String>{

        // class variables
            private  Context context;// to save context
            private 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


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

            ViewHolder holder=null;
            // if view is not loaded
            if (!(convertView instanceof View)) {
                holder = new ViewHolder();

                convertView = inflater.inflate(R.layout.adapter_list_duas, parent, false);
                // load the view from holder class
                holder.background = (LinearLayout) convertView.findViewById(R.id.ll_duas_list);
                holder.iv_duatype = (ImageView) convertView.findViewById(R.id.iv_duatype);
                holder.tv_dua_arabic = (TextView) convertView.findViewById(R.id.tv_dua_arabic);
                holder.tv_dua_no = (TextView) convertView.findViewById(R.id.dua_no);
                //holder = new ViewHolder(convertView);
                // set the tag for future use
                convertView.setTag(holder);
            }
            // if view is loaded
            else{
                // get view from tag
                holder = (ViewHolder) convertView.getTag();
            }
    convertView.setOnLongClickListener(new OnLongClickListener() {

                    @Override
                    public boolean onLongClick(View v) {



                    final View view = v;
                        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                switch (which) {
                                    case DialogInterface.BUTTON_POSITIVE:{
                                        ViewHolder holder = (ViewHolder) view.getTag();

                                        int index = holder.duaIndex;

                                        ((MainActivity) context).removeItemFromList(index);
                                    //  ((MainActivity) context).loadDuasListFragment();

                                        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 false;
                    }

                });


            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;
    }
}
  

Класс фрагмента:

 @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);
}

/** method removing the accurate item form list, checked by debugging**/

public void removeItemFromList(int index) {
        String verses = new SharedPreferencesSupplication().read(SingletonClass.keyListOfVerses, "a1");
        String[] versesList = verses.split(",");
        String identifier = versesList[index];
        new FavoriteDuas().removeDua(identifier);
        updatedData();
    }



    public void updatedData() {
        boolean keyIsFavSel = new SharedPreferencesSupplication().read(SingletonClass.keyIsFavSelected, false);
        if (keyIsFavSel)
            new SharedPreferencesSupplication().save(SingletonClass.keyListOfVerses, new SharedPreferencesSupplication().read(SingletonClass.keyFavVerses, "a1"));
        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.clear();

if (duas.size() > 0) {

            for (String object : duas) {

                duasAdapter.insert(object, duasAdapter.getCount());

            }
        }

            duasAdapter.notifyDataSetChanged();


}
  

Комментарии:

1. Извините, но я не понимаю, что именно происходит. В чем проблема с этим последним элементом и нажатым элементом? Пожалуйста, перефразируйте вашу проблему.

2. which involves the use of SharedPreferences. но как? Я вижу, что вы делаете. Должен ли я выяснить, что? Лучше тебе рассказать. you have to come back to the fragment. ? Извините, но вы не сказали, что «оставили» фрагмент. Вы даже не назвали фрагмент раньше. Поэтому, пожалуйста, объясните лучше.

3. @greenapps, пожалуйста, проверьте. Надеюсь, на этот раз я ясно выразился!

4. Покажите, что вы устанавливаете DuasListAdapter в качестве вашего ListView адаптера.

5. Вы говорите, что listview извлекается с использованием общих настроек. Хорошо, пусть будет так. Но что вы делаете с общими настройками после удаления и элемента из списка? Вы не сказали, что будете что-то делать с общими настройками. Пожалуйста, объясните лучше. Мне неясно, где после закрытия диалогового окна «вы находитесь», поскольку, по-видимому, вы находитесь где-то, откуда вы можете вернуться к фрагменту.