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