ListView 在 线程里不显示的问题

Android 码拜 6年前 (2015-05-10) 278次浏览 0个评论

import android.app.ProgressDialog;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import org.json.JSONArray;
import org.json.JSONObject;

import android.os.Handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class MainActivity extends ActionBarActivity {

private TextView tv;
private ListView lv;
private Handler handler;
private Thread thread;
private SimpleAdapter simpleAdapter;
private ProgressDialog progressDialog;
public MainActivity() {
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView)findViewById(R.id.textView1);
lv=(ListView)findViewById(R.id.listView);

simpleAdapter=new SimpleAdapter(this,getdate(),R.layout.layout,new String[]{“name”},new int[]{R.id.textView2});
//  progressDialog = ProgressDialog.show(MainActivity.this, “请稍等”, “正在下载数据…”, true);
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
// smAdapter.notifyDataSetChanged(); //发送消息通知ListView更新
//list.setAdapter(smAdapter); // 重新设置ListView的数据适配器
// tv.setText(getdate()+””);
simpleAdapter.notifyDataSetChanged();
lv.setAdapter(simpleAdapter);
break;
default:

//do something
break;
}

}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
//   Thread.sleep(2000);
SimpleClient.getHttpClient();//初始化工具类(SimpleClient)
zifuchuan=SimpleClient.doPost(“http://192.168.0.9/lianxi/shuchu.aspx”,null);
// getdate();
handler.sendEmptyMessage(0);
// progressDialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}

}

}).start();
}

private  List<Map<String,Object>> getdate(){
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
try {
JSONArray arr = new JSONArray(zifuchuan);
for (int i = 0; i < arr.length(); i++) {

Map<String,Object> map=new HashMap<String,Object>();
JSONObject    temp = (JSONObject) arr.get(i);
map.put(“name”,temp.getString(“name”));
list.add(map);

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

return list;

}

String zifuchuan=””;
String name;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}
simpleAdapter=new SimpleAdapter(this,getdate(),R.layout.layout,new String[]{“name”},new int[]{R.id.textView2}); 这句写在线程里是报错的!
单显示 getdate()是能显示出来的 可是我加了线程 就不显示 求各位大神给看看哪错了!

肯定是getdata()报空指针吧,你要把 simpleAdapter=new SimpleAdapter(this,getdate(),R.layout.layout,new String[]{“name”},new int[]{R.id.textView2});这句放在handlermessge中。因为你那时候zifuchuan还没得到。
25分
1.  你拿到数据没有往adapter中塞啊?
2. 一般的开发过程是,先listview.setadapter();后面在直接在adapter中upadate新数据就好了
引用 1 楼 u013377714 的回复:

肯定是getdata()报空指针吧,你要把 simpleAdapter=new SimpleAdapter(this,getdate(),R.layout.layout,new String[]{“name”},new int[]{R.id.textView2});这句放在handlermessge中。因为你那时候zifuchuan还没得到。

看我最后那句话啊 我单打印getdate()是能显示数据的!

引用 2 楼 hvk687 的回复:

1.  你拿到数据没有往adapter中塞啊?
2. 一般的开发过程是,先listview.setadapter();后面在直接在adapter中upadate新数据就好了

看我最后那句话啊 我单打印getdate()是能显示数据的!

对了补充一下,我上边的那些代码 是因为在手机上不显示数据而且 也不报错,但是 如果把线程去掉的话就会显示数据,请大家帮我看看哪里写的不对吧
20分
你getdata() 获取到数据了又怎么样 好好看看人家说的 你根本没有往adapter里重新塞值  simpleAdapter.notifyDataSetChanged();你一味的刷新有什么用  你要么就重新给这个adapter 赋值然后重新给listview 附上adpter 要么就用个全局的data 更改 data后 调用
notifyDataSetChanged(); 来刷新列表
simpleAdapter.notifyDataSetChanged();
lv.setAdapter(simpleAdapter);
你这边的这两句话 都是只做了一半的事情 你让他怎么能正常显示数据

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明ListView 在 线程里不显示的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!