【问题标题】:ListView not refreshing after calling clear() and notifyDataSetChanged() in android在android中调用clear()和notifyDataSetChanged()后ListView不刷新
【发布时间】:2015-05-11 16:02:31
【问题描述】:

我想要做的是每 5 秒刷新一次 ListView。为此,我使用 notifyDataSetChanged()。如果我只使用它,列表将刷新,但项目会添加到已经存在的项目的末尾。如果我在此之前使用 clear() 和 addAll(),则 ListView 为空。我应该怎么做才能解决这个问题?这是我的代码:

  public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.online_drivers_window);
    online_drivers_name = getIntent().getExtras().getStringArrayList("drivers_name");
    online_drivers_availability = getIntent().getExtras().getStringArrayList("drivers_availability");
    ListView L = (ListView)findViewById(android.R.id.list);
    final IconAdapter adapter = new IconAdapter(this,R.layout.list_item,R.id.label,online_drivers_name);
    L.setAdapter(adapter);
    Timer tm = new Timer();
    tm.schedule(new TimerTask()
    {
        @Override
        public void run()
        {
           update();
            runOnUiThread(new Runnable() {

                @Override
                public void run()
                {
                    adapter.clear();
                    adapter.addAll(online_drivers_name);
                    adapter.notifyDataSetChanged();

                }
            });


        }
    },0,5000); }

public void update()
{
    try
    {
        cs = new Socket(HOST, 2014);
        final DataOutputStream os = new DataOutputStream(cs.getOutputStream());
        final DataInputStream is = new DataInputStream(cs.getInputStream());
        os.writeUTF(type);
        os.writeUTF("show_drivers");
        int num = is.readInt();
        String s,av;
        ArrayList<String> aux_name = new ArrayList<>();
        ArrayList<String> aux_availability = new ArrayList<>();
        for(int i = 0; i < num; i++)
        {
            s = is.readUTF();
            av = (is.readBoolean() == true) ? "true" : "false";
            aux_name.add(s);
            aux_availability.add(av);
        }
        for(int i = 0; i < aux_name.size();i++)
            if(!online_drivers_name.contains(aux_name.get(i)))
            {
                online_drivers_name.add(aux_name.get(i));
                online_drivers_availability.add(aux_availability.get(i));
            }
        for(int j = 0; j < online_drivers_name.size();j++)
            if(!aux_name.contains(online_drivers_name.get(j)))
            {
                online_drivers_name.remove(j);
                online_drivers_availability.remove(j);
            }
            else
            {
                int k = aux_name.indexOf(online_drivers_name.get(j));
                if(!aux_availability.get(k).equals(online_drivers_availability.get(j)))
                {
                    online_drivers_name.remove(j);
                    online_drivers_availability.remove(j);
                    online_drivers_name.add(aux_name.get(k));
                    online_drivers_availability.add(aux_availability.get(k));
                }
            }
        cs.close();
        os.close();
        is.close();

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 你为什么不清除 arrayList ?
  • 我在update()方法中改变arrayList
  • 删除adapter.clear(),如果你在update()方法中清除arraylist,那么更新listview就可以了

标签: android listview


【解决方案1】:

听起来很清楚,您在online_drivers_name 中添加了一个字符串,因此它出现在列表的末尾。

如果您想对ArrayList 进行排序,请在更新方法结束时尝试此操作:

Collections.sort(online_drivers_name.subList(1, online_drivers_name.size()));

【讨论】:

  • 不,我不是这个意思。我需要的是删除ListView中显示的旧项目,然后显示update()的结果。问题是,如果我使用 adapter.clear() 然后 adapter.addAll() 什么都不会显示。
【解决方案2】:

您似乎没有更新您的数组列表,请尝试使用以下代码,如果您对此有任何疑问,请告诉我

  public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.online_drivers_window);
        online_drivers_name = getIntent().getExtras().getStringArrayList("drivers_name");
        online_drivers_availability = getIntent().getExtras().getStringArrayList("drivers_availability");
        ListView L = (ListView)findViewById(android.R.id.list);
        final IconAdapter adapter = new IconAdapter(this,R.layout.list_item,R.id.label,online_drivers_name);
        L.setAdapter(adapter);
        Timer tm = new Timer();
        tm.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
              new ArrayList<String> online_drivers_name = update();
                runOnUiThread(new Runnable() {

                    @Override
                    public void run()
                    {
                        adapter.clear();
                        adapter.addAll(online_drivers_name);
                        adapter.notifyDataSetChanged();

                    }
                });


            }
        },0,5000); }

    public ArrayList<String> update()
    {
        try
        {
            cs = new Socket(HOST, 2014);
            final DataOutputStream os = new DataOutputStream(cs.getOutputStream());
            final DataInputStream is = new DataInputStream(cs.getInputStream());
            os.writeUTF(type);
            os.writeUTF("show_drivers");
            int num = is.readInt();
            String s,av;
            ArrayList<String> aux_name = new ArrayList<>();
            ArrayList<String> aux_availability = new ArrayList<>();
            for(int i = 0; i < num; i++)
            {
                s = is.readUTF();
                av = (is.readBoolean() == true) ? "true" : "false";
                aux_name.add(s);
                aux_availability.add(av);
            }
            for(int i = 0; i < aux_name.size();i++)
                if(!online_drivers_name.contains(aux_name.get(i)))
                {
                    online_drivers_name.add(aux_name.get(i));
                    online_drivers_availability.add(aux_availability.get(i));
                }
            for(int j = 0; j < online_drivers_name.size();j++)
                if(!aux_name.contains(online_drivers_name.get(j)))
                {
                    online_drivers_name.remove(j);
                    online_drivers_availability.remove(j);
                }
                else
                {
                    int k = aux_name.indexOf(online_drivers_name.get(j));
                    if(!aux_availability.get(k).equals(online_drivers_availability.get(j)))
                    {
                        online_drivers_name.remove(j);
                        online_drivers_availability.remove(j);
                        online_drivers_name.add(aux_name.get(k));
                        online_drivers_availability.add(aux_availability.get(k));
                    }
                }
            cs.close();
            os.close();
            is.close();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

return online_drivers_name;
    }

【讨论】:

  • 不,它不起作用。而且我用调试器检查过,arrayList 更新正确,所以我很确定这不是问题。
  • 而不是 adapter.clear(); , 适配器.addAll(online_drivers_name);再设置一次适配器
猜你喜欢
  • 2013-01-08
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多