当前位置: 首页 > 知识库问答 >
问题:

listview不会在android片段中刷新通知fyDataSetChanged()

蒋奇
2023-03-14

在我的android应用程序中,两个月以来我一直无法解决这个问题,即使在尝试了堆栈溢出中发现的许多类似解决方案之后。我正在用ArrayAdapter填充listview。长时间按下listview的某个项目时,会出现一个对话框,要求确认。确认后,所选项目将从数组列表中删除,但在listview中,最后一个项目似乎已删除。当您关闭片段并返回到它时,您会看到正确的项目,但不会在关闭警报对话框后立即看到。

有人能帮忙吗?谢谢!

适配器类

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

        }
}

碎片类

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

    }

}

共有1个答案

林和畅
2023-03-14

我也面临着同样的问题,通知数据更改方法。

我的问题是我附加到适配器的列表正在更新,但通知数据集更改方法不起作用。

如果ListView设计为在其中显示中等数量的项目,则可以重新创建适配器,而不是调用notifydatasetchanged。

这对我有用。我在使用BaseAdapter。

 类似资料:
  • 我有Mainactive,它保存片段。我的一个片段(参与者)检查数据库中是否有任何内容。如果没有,则显示带有消息以添加数据的片段(空参与者列表)。如果是,它显示带有2个选项卡的TabHost片段,其中一个包含带有数据库条目的ListView片段(参与者列表)。有一个FAB按钮可以添加更多记录。添加另一条记录后如何刷新ListView?我不确定,因为TabHost不适用于我在应用程序中使用的Frag

  • 当我从listview中添加或删除一个项目时,listview不会更新,除非我在viewpager中滚动到屏幕外,然后返回,在片段中再次触发OnCreate方法。这是基于eclipse中的viewpager模板的,我只是在片段中添加了一个listview,而不仅仅是一个textview。将notifyDataSetChanged放置到片段中没有帮助,也没有向片段中添加OnResume。以下是主要活

  • 我遇到了一个如何在对话框片段中更新片段的问题。 当我单击过滤器菜单按钮时,会显示一个新的对话框片段,其中包括一个无线电组。 我想在单击ok按钮时更新包含位置列表的片段。 它是PlaceActive的代码,其中包含PlaceFraank: 公共类PlaceActive扩展AppCompatActive{ } 以下是PlaceFragment类的代码: 公共类PlaceFragment扩展了片段{ }

  • 我有一个IntentService 9:00开始,每小时重复一次。 它与创建捆绑包的AsyncTask一起工作。 IntentService必须在对话框中显示一个活动(就像Viber用于消息一样),它显示此BUNDLE中的一部分数据,并且它必须创建一个显示相同部分数据的通知。如果用户单击通知,它将启动第二个活动,显示BUNDLE中的所有数据。 问题是:IntentService完成他的工作,显示活

  • 我试着在发帖前在里面搜索,但我不能理解如何刷新片段中托管的ViewPager的内容。你能帮帮我吗? 谢谢你抽出时间 } 这是pageviewer中的imageview的类

  • 我有一个由片段填充的ViewPager。特别是,我有一个片段,它显示了Addresses对象的列表和一个允许创建新地址的列表。添加新地址的过程如下: 因此,当添加新地址时,我回到AddressListFragment,它是ViewPager中的活动地址。我需要更新该片段,以便更新列表与新添加的地址时,我回来它!我需要在那个片段上重写一个特定的方法吗? 提前道谢!