ListView的最后一项似乎在notifyDataSetChanged()上被删除

时间:2014-07-06 03:09:08

标签: android listview android-fragments sharedpreferences notifydatasetchanged

在我的android应用程序中,我有和Array Adapter(用于填充listview)和一个具有ListView的Fragment。 listview中的数据使用“共享首选项”检索。问题是,当选择删除列表视图的任何项目时,最后一项似乎每次都被删除。

例如,如果列表总共有5个项目,您选择在按住后删除第2个项目。删除后,第5项似乎在列表中删除,除非您按回按钮然后返回到相同的片段,然后您会看到列表视图中存在的正确项目。 在立即关闭对话框后,ListView无法正确刷新,您必须返回到片段。

请帮助,我几个月来一直试图修复它而没有成功。非常感谢!

Adpater Class:

     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();


}

0 个答案:

没有答案