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