使用BaseAdater遇到的问题

使用BaseAdater遇到的问题

img

如图所示,跳转到其他界面返回时会再次加载列表,在原有列表项的基础上把已经有的列表项又加载了一边有什么办法解决?

这是BaseAdapter(省略了一些不重要的内容)


public MyAdapter(Context context, List<Map<String, Object>> data, SparseBooleanArray stateCheckedMap) {
        this.data = data;
        mContext = context;
        this.stateCheckedMap = stateCheckedMap;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @SuppressLint("ViewHolder")
    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = View.inflate(mContext, R.layout.bottom_collect_item, null);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        
          /**绑定控件*/
        holder.name = convertView.findViewById(.........);
         holder.name = ...........;
       
        for(int i = 0;i < data.size();i++)
        {
            String[] names=new String[data.size()];
            String[] authors=...........
            ...........

            Map<String,Object> map = data.get(position);
           /**给控件设值*/
            holder.name.setText(names[i]);
            holder.author..........
        }

        return convertView;
    }

    public class ViewHolder {

        public TextView name;
        ........
    }

这是设置listview的代码(返回的就是这个界面)

public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_gallery, container,false);
         
        sh = new SharedHelper(mContext);
        mContext=getActivity().getApplication();
        
        /**控件绑定
        listView = view.findViewById(R.id.listview_g_c);
        bottom_select =........

        mContext=getContext();
        sh = new SharedHelper(mContext);
        
        initData();//获取列表数据

        return view;
    }
    
    private void initData() {
        mContext=getContext();
        sh = new SharedHelper(mContext);
        Mapiddata=sh.readid();

        new Thread(() -> {
            int count= Collect.Count_from_c(iddata.get("id"));

            authors=new String[count];
            times=............

            try {
                names=Collect.getnames_from_c(iddata.get("id"));

                for (int i=0;icollect_list=new HashMap<>();

                    collect_list.put("name",names[i]);
                    collect_list.put..........

                    listitem.add(collect_list);
                }

                adapter = new MyAdapter(getContext(), listitem, stateCheckedMap);
                listView.post(() -> listView.setAdapter((adapter)));

            } catch (Exception e) {
                e.printStackTrace();
                Log.e(TAG, "异常Gallery:" + e.getMessage());
            }

        }).start();

        setStateCheckedMap(false);
    }

使用BaseAdapter遇到的问题:跳转到其他界面返回时会再次加载列表,在原有列表项的基础上把已经有的列表项又加载了一遍,有什么办法解决? 可能的解决方案: 1.在返回时重新设置适配器,避免重复加载,即在跳转其他界面前记录当前页面的适配器,返回时重新设置适配器。示例代码: //在跳转其他界面前记录当前页面的适配器 MyAdapter adapter = new MyAdapter(this, ss); listView.setAdapter(adapter); //跳转到其他界面 返回时重新设置适配器 listView.setAdapter(adapter); 2.在页面销毁时清空数据,避免重复加载,示例代码: @Override protected void onDestroy() { super.onDestroy(); ss = null; } 如果上述方案仍不能解决问题,可能需要进一步分析和测试问题的原因。

看你的列表item点击事件,进入的是什么界面(单独的活动吗?)
再看你列表数据的加载是放在哪里的(这个地方在返回列表时加载了)

首先感谢回答,其次,我是SB
private List<Map<String,Object>> listitem=new ArrayList<>();定义在了onCreateView之前
找到问题所在了,首次进入该页面时,往listitem里面添加了两组数据(listitem.size=2),跳转到其他页面在返回时这两组数据仍然存在,所以就又添加了两组相同的数据此时(listitem.size=4);在initData()里面初始化就好了