Android 如何始终刷新ListView内容?

Android 如何始终刷新ListView内容?,android,listview,android-adapter,Android,Listview,Android Adapter,我正在制作一个android应用程序,从数据库中获取在线的Everymont玩家。每个玩家都在ListView中占有一席之地,是一个项目列表。该列表按我的预期刷新,但当我单击项目列表时,我的应用程序崩溃。我在android监视器中看到一个非法状态异常,我不知道为什么。我想这是因为我在更改内容时使用列表视图,同时按下按钮。你能帮我一个忙或建议其他事情吗? 在下面的代码中,我从数据库下载数据,然后将其放入列表中 public void onclickRefreshfunction() {

我正在制作一个android应用程序,从数据库中获取在线的Everymont玩家。每个玩家都在ListView中占有一席之地,是一个项目列表。该列表按我的预期刷新,但当我单击项目列表时,我的应用程序崩溃。我在android监视器中看到一个非法状态异常,我不知道为什么。我想这是因为我在更改内容时使用列表视图,同时按下按钮。你能帮我一个忙或建议其他事情吗? 在下面的代码中,我从数据库下载数据,然后将其放入列表中

public void onclickRefreshfunction()  {

    num = -1;

    runOnUiThread(new Runnable() {

        @Override
        public void run() {

            if (lock == 1) {

                lock = 0;

                ArrayAdapter<String> adapter = new ArrayAdapter<String>(OnLinePlayerActivity.this,
                        android.R.layout.simple_list_item_1, android.R.id.text1, list_of_onlineplayer);

                adapter.clear();
                adapter.notifyDataSetChanged();

                list_of_levels.clear();
                list_of_onlineplayer.clear();
                list_of_usernames.clear();

                Response.Listener<String> responseListener = new Response.Listener<String>() {

                    @Override
                    public void onResponse(final String response) {

                        try {

                            JSONObject jsonResponse = new JSONObject(response);
                            JSONArray usernamearray = jsonResponse.getJSONArray("list_of_usernames");
                            JSONArray levelarray = jsonResponse.getJSONArray("list_of_levels");

                            for (int i = 0; i < usernamearray.length(); i++) {

                                String name = usernamearray.getString(i);

                                if (name.equals(username)) {

                                    num = i;
                                    continue;

                                }

                                list_of_usernames.add(name);

                            }

                            for (int i = 0; i < levelarray.length(); i++) {

                                String level = levelarray.getString(i);

                                if (i == num) {

                                    continue;

                                }

                                list_of_levels.add(level);

                            }

                            for (int i = 0; i < list_of_usernames.size(); i++) {

                                list_of_onlineplayer.add("  Παίκτης  "+list_of_usernames.get(i) + "  επίπεδο  " + list_of_levels.get(i));

                            }

                            listView = (ListView) findViewById(R.id.list);
                            ArrayAdapter<String> adapter = new ArrayAdapter<String>(OnLinePlayerActivity.this,
                                    android.R.layout.simple_list_item_1, android.R.id.text1, list_of_onlineplayer);

                            listView.setAdapter(adapter);

                            lock = 1;

                        } catch (JSONException e) {

                            e.printStackTrace();

                        }
                    }
                };
                Response.ErrorListener error = new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        Log.w("error with volley", "error");
                        onclickRefreshfunction();

                    }
                };

                OnlineRequest onlineRequest = new OnlineRequest(responseListener , error);
                //  RequestQueue queue = Volley.newRequestQueue(OnLinePlayerActivity.this);
                //  queue.add(onlineRequest);
                Mysingleton.getmInstance(getApplicationContext()).addToRequestque(onlineRequest);

            }
        }
    });
}

我想这可能是关键部分的一个问题,我不确定。因此我需要您的帮助来了解listview是如何工作的。

一旦您修改了列表,即通过删除或编辑其内容,您需要在适配器上调用“notifyDataSetChanged()”来通知您的适配器更改。在您的代码中,您正在响应方法之外调用notifyDataSetChanged。

将runOnUiThread放在您的响应Leister中,您可以在其中设置列表视图和适配器。

首先,您被runOnUiThread()分心,响应侦听器可能会在不同的线程上调用,取决于你的Mysingleton的OnlineRequest处理程序。 其次,您正在代码的顶部行创建一个未使用的ArrayAdapter。 第三,您不需要每次都创建一个新的ArrayAdapter,只需更改列表内容并调用notifyDataSetChanged()

我认为下面的代码应该可以解决您的问题:

    public void onclickRefreshfunction()  {
    num = -1;
    if (lock == 1) {
        lock = 0;

        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(final String response) {
                list_of_levels.clear();
                list_of_onlineplayer.clear();
                list_of_usernames.clear();

                try {
                    JSONObject jsonResponse = new JSONObject(response);
                    JSONArray usernamearray = jsonResponse.getJSONArray("list_of_usernames");
                    JSONArray levelarray = jsonResponse.getJSONArray("list_of_levels");

                    for (int i = 0; i < usernamearray.length(); i++) {

                        String name = usernamearray.getString(i);
                        if (name.equals(username)) {
                            num = i;
                            continue;
                        }

                        list_of_usernames.add(name);
                    }

                    for (int i = 0; i < levelarray.length(); i++) {
                        String level = levelarray.getString(i);
                        if (i == num) {
                            continue;
                        }
                        list_of_levels.add(level);
                    }

                    for (int i = 0; i < list_of_usernames.size(); i++) {
                        list_of_onlineplayer.add("  Παίκτης  "+list_of_usernames.get(i) + "  επίπεδο  " + list_of_levels.get(i));
                    }

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            listView = (ListView) findViewById(R.id.list);
                            ArrayAdapter<String> adapter = new ArrayAdapter<String>(OnLinePlayerActivity.this,
                                    android.R.layout.simple_list_item_1, android.R.id.text1, list_of_onlineplayer);

                            listView.setAdapter(adapter);
                        }
                    });
                    lock = 1;

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };
        Response.ErrorListener error = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.w("error with volley", "error");
                onclickRefreshfunction();
            }
        };

        OnlineRequest onlineRequest = new OnlineRequest(responseListener , error);
        //  RequestQueue queue = Volley.newRequestQueue(OnLinePlayerActivity.this);
        //  queue.add(onlineRequest);
        Mysingleton.getmInstance(getApplicationContext()).addToRequestque(onlineRequest);
    }
}
public void onclickRefreshfunction(){
num=-1;
如果(锁==1){
lock=0;
Response.Listener responseListener=新的Response.Listener(){
@凌驾
公共void onResponse(最终字符串响应){
列出_级别的_。清除();
列出_onlineplayer.clear()的_;
列出所有用户名。清除();
试一试{
JSONObject jsonResponse=新的JSONObject(响应);
JSONArray usernamearray=jsonResponse.getJSONArray(“用户名列表”);
JSONArray levelarray=jsonResponse.getJSONArray(“级别列表”);
对于(int i=0;i
您可以发布一个示例吗?请参阅此处的Android SDK官方文档:在此代码中,您可以调用notifyDataSetChanged();调用列表视图的setAdapter时,不需要调用notifyDataSetChanged()。只有在更改当前适配器的内部列表时,才应该调用后一种方法。
    public void onclickRefreshfunction()  {
    num = -1;
    if (lock == 1) {
        lock = 0;

        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(final String response) {
                list_of_levels.clear();
                list_of_onlineplayer.clear();
                list_of_usernames.clear();

                try {
                    JSONObject jsonResponse = new JSONObject(response);
                    JSONArray usernamearray = jsonResponse.getJSONArray("list_of_usernames");
                    JSONArray levelarray = jsonResponse.getJSONArray("list_of_levels");

                    for (int i = 0; i < usernamearray.length(); i++) {

                        String name = usernamearray.getString(i);
                        if (name.equals(username)) {
                            num = i;
                            continue;
                        }

                        list_of_usernames.add(name);
                    }

                    for (int i = 0; i < levelarray.length(); i++) {
                        String level = levelarray.getString(i);
                        if (i == num) {
                            continue;
                        }
                        list_of_levels.add(level);
                    }

                    for (int i = 0; i < list_of_usernames.size(); i++) {
                        list_of_onlineplayer.add("  Παίκτης  "+list_of_usernames.get(i) + "  επίπεδο  " + list_of_levels.get(i));
                    }

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            listView = (ListView) findViewById(R.id.list);
                            ArrayAdapter<String> adapter = new ArrayAdapter<String>(OnLinePlayerActivity.this,
                                    android.R.layout.simple_list_item_1, android.R.id.text1, list_of_onlineplayer);

                            listView.setAdapter(adapter);
                        }
                    });
                    lock = 1;

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };
        Response.ErrorListener error = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.w("error with volley", "error");
                onclickRefreshfunction();
            }
        };

        OnlineRequest onlineRequest = new OnlineRequest(responseListener , error);
        //  RequestQueue queue = Volley.newRequestQueue(OnLinePlayerActivity.this);
        //  queue.add(onlineRequest);
        Mysingleton.getmInstance(getApplicationContext()).addToRequestque(onlineRequest);
    }
}