一个ListActivity, 需要更新listview的内容. 当前Activity的页脚有个button, 点击就可以update. 也就是希望数据下载, 然后更新数据源,并且显示新的列表内容目前,下载,更新数据源都已经搞定,就是列表不更新。看了网上说,不能在子线程来更新UI,所以就用了handler的handleMessage方法. 但还是未果, 根据log上看. adapter的数据list已经更新了. 而且点击List的Item后, 也是新的数据. 就是显示还是老的.相关代码用红色标注了.public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.fairlist);
System.out.println("into fairlistactivity ----------------->");
mData = getData();
System.out.println("mData onCreate --------------->" + mData.size());
this.getListView().setSelected(true);
// this.getListView().setDivider(null); SimpleAdapter adapter = new SimpleAdapter(this, mData,
R.layout.imglist, new String[] { "messe_title", "messe_date",
"messe_logo_s" }, new int[] { R.id.messe_title,
R.id.messe_date, R.id.messe_logo_s });
adapter.setViewBinder(new GcViewBinder());
this.setListAdapter(adapter);
baseurl = GcGlobalArguments.getMegDict().get("baseurl");
System.out.println("baseurl : " + baseurl); View updateButton = findViewById(R.id.update_btn);
updateButton.setOnClickListener(this);
System.out.println("isUpdate------------>" + isUpdate);
}private List<Map<String, Object>> getData() {
System.out.println("getDate ----------------->start");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, String> eventlist_tmp = new HashMap<String, String>(); if (GcUtil.existFile(filePath_MEG + configFile)) {
List<String> splitList = new ArrayList<String>();
splitList.addAll(Arrays.asList(GcUtil.readTxt(filePath_MEG,
configFile).split("\n")));
for (String str : splitList) {
if (!str.startsWith("#")) {
eventlist_tmp.put(str.split("=")[0], str.split("=")[1]);
}
}
GcGlobalArguments.setEventlistDict(eventlist_tmp);
} int maxveranst = Integer.parseInt((String) GcGlobalArguments
.getEventlistDict().get("veranstlistcount"));
System.out.println("there are " + maxveranst + " events in the list"); for (int i = 1; i <= maxveranst; i++) {
Map<String, Object> map = new HashMap<String, Object>();
System.out.println("logo Path = "
+ filePath_MEG
+ (String) GcGlobalArguments.getEventlistDict().get(
"veranst" + i + "_logo") + ".png"); Bitmap img = this.getImageFromFile(filePath_MEG
+ (String) GcGlobalArguments.getEventlistDict().get(
"veranst" + i + "_logo") + ".png");
map.put("messe_title", (String) GcGlobalArguments
.getEventlistDict().get("veranst" + i + "_name"));
map.put("messe_date", (String) GcGlobalArguments.getEventlistDict()
.get("veranst" + i + "_date"));
map.put("messe_logo_s", img);
map.put("messe_id", (String) GcGlobalArguments.getEventlistDict()
.get("veranst" + i + "_messeid"));
list.add(map); }
System.out.println("getData ------------------>end");
return list; }@Override
public void onClick(View v) {
System.out.println("Update button--------------> click!");
ConnectivityManager nw = (ConnectivityManager) FairListActivity.this
.getSystemService(Context.CONNECTIVITY_SERVICE);
System.out.println("ConnectivityManager----------->" + nw); NetworkInfo netinfo = nw.getActiveNetworkInfo();
System.out.println("NetworkInfo--------------->" + netinfo);
// beim Emulator kann getActiveNetworkInfo ein Null sein
if (nw.getActiveNetworkInfo() != null) {
if (netinfo.isAvailable() && netinfo.isConnected()) {
System.out.println("network works-------------->checked!");
updatedownload();
} else {
alertNonet();
}
} else {
if (netinfo.isAvailable()) {
System.out.println("network works-------------->checked!");
updatedownload();
} else {
alertNonet();
}
}
} private void updatedownload() {
System.out.println("updatedownload-------------------------->start");
Dialog dialog = new AlertDialog.Builder(FairListActivity.this).setIcon(
android.R.drawable.ic_dialog_info).setCancelable(false)
.setTitle(R.string.dialg_info).setMessage(R.string.update_text)
.setPositiveButton(R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
dialog.dismiss(); final ProgressDialog pDialog = new ProgressDialog(
FairListActivity.this);
pDialog
.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.setTitle(R.string.dialg_info);
pDialog.setMessage(getResources().getString(
R.string.loading));
pDialog.setIndeterminate(false);
pDialog.show(); handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
System.out
.println("UI update--------------->");
isUpdate = true; System.out
.println("Listview------------->refresh start");
SimpleAdapter adapter = (SimpleAdapter) FairListActivity.this
.getListAdapter();
mData = null;
mData = getData();
System.out
.println("mData() onUpdate------------->"
+ mData.size());
// FairListActivity.this.setListAdapter(adapter);
// adapter.setViewBinder(new
// GcViewBinder());
adapter.notifyDataSetChanged();
System.out
.println("isUpdate------------>"
+ isUpdate);
System.out
.println("Listview------------->refresh end");
break;
}
default:
break;
} } };

// Thread t = new Thread(new Runnable()
handler.post(new Runnable() { @Override
public void run() { System.out
.println("update thread 1 ------------------------>aktive");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { e1.printStackTrace();
} if (GcUtil.downloadFile(
GcGlobalArguments.ZIP_URL,
megFile, filePath, 20) == 1) { File zipFile = new File(filePath
+ megFile); try {
GcUtil
.deleteDirectory(filePath_MEG);
GcUtil.upZipFile(zipFile,
filePath_MEG);
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} try {
GcUtil.deleteFile(filePath
+ megFile);
} catch (Exception e) { } Map<String, String> megDict_tmp = new HashMap<String, String>();
List<String> splitList = new ArrayList<String>();
splitList.addAll(Arrays
.asList(GcUtil.readTxt(
filePath_MEG,
configFile).split(
"\n")));
for (String str : splitList) {
if (!str.startsWith("#")) {
megDict_tmp.put(str
.split("=")[0], str
.split("=")[1]);
}
}
GcGlobalArguments
.setMegDict(megDict_tmp); pDialog.dismiss(); handler.sendEmptyMessageDelayed(
UPDATE_UI, 0);

System.out
.println("handler message -----------> gesendet!");
} else { alertTimeout(); }
} });
// t.start(); }
}).setNegativeButton(R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
dialog.dismiss();
}
}).create(); dialog.show(); }

解决方案 »

  1.   

    在handler里重新setListAdapter看看~~~这个是整个页面刷新的
    我也在为更新的事儿发愁呢 我想弄一个只有其中一个item刷新的 请求大牛们援助~~~
      

  2.   

    SimpleAdapter adapter = new SimpleAdapter不建议用SimpleAdapter,以后自己定义Adapter知道么,=你数据复杂了你就知道SimpleAdapter不好用了。贴一段我项目的代码你自己看看那吧package com.jftt.dice.activity;import com.jftt.dice.date.DataBase;
    import com.jftt.dice.activity.R;import android.app.Activity;
    import android.content.Context;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.BaseAdapter;
    import android.widget.CheckBox;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;public class ModelActivity extends Activity {
    private ListView listview;
    private DataBase mDateBase;
    private Cursor mCursor;
    private String modelname;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mDateBase = new DataBase(this);
    mCursor = mDateBase.select();// 查询数据库
    listview = (ListView) findViewById(R.layout.user);
    listview.setAdapter(new MyAdapter(this, mCursor));// 加入适配器
    }
    public class MyAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private Cursor mCursor; public MyAdapter(Context c, Cursor cursor) {
    this.inflater = LayoutInflater.from(c);
    mCursor = cursor;
    } @Override
    public int getCount() {
    return mCursor.getCount();
    } @Override
    public Object getItem(int position) {
    return null;
    } @Override
    public long getItemId(int position) {
    return 0;
    } public View getView(int position, View convertView, ViewGroup parent) {
    View myView = inflater.inflate(R.layout.user, null);
    mCursor.moveToPosition(position);
    final TextView textView = (TextView) myView
    .findViewById(R.id.TextView_model);
    final CheckBox CheckBox01 = (CheckBox) myView
    .findViewById(R.id.CheckBox01);
    int a=mCursor.getInt(8);
    textView.setText(mCursor.getString(1));
    if(a==2){
    CheckBox01.setChecked(true);
    }
    if(a==1){
    CheckBox01.setChecked(false);
    }
    CheckBox01.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    for (int num = 0; num < mCursor.getCount(); num++) {
    if (mCursor.moveToPosition(num)
    && mCursor.getInt(8)==2) {
    mDateBase.update(mCursor.getString(1), 1);
    }
    }
    modelname = textView.getText().toString();
    mDateBase.update(modelname, 2);
    mCursor = mDateBase.select();
    Toast.makeText(ModelActivity.this, modelname+"设为模式成功",
    Toast.LENGTH_SHORT).show();
    Message message = new Message();
    message.what = 1;
    handler.sendMessage(message);
    }
    });

    return myView;
    }
    }
    public Handler handler = new Handler() {
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case 1:
    listview.invalidateViews();
    break;
    }
    super.handleMessage(msg);
    }
    };
    }
      

  3.   

    在eoeandroid贴过了,这里看到了,也顺便贴一下。我也是找问题才查到这些帖子的。
    我也碰到同样的问题,刚刚解决了。把解决方法贴出来:
    楼主的写法:
    ArrayList<HashMap<String, Object>> dataArray;
    dataArray = getData();
    private ArrayList<HashMap<String, Object>> getData() {
      ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
      //这里向arrayList填入数据,略过
      return arrayList;
    }换一种写法就可以解决:
    public void onCreate(Bundle savedInstanceState) {
      dataArray = new ArrayList<HashMap<String, Object>>();
    }
    private void getData() {
      dataArray.clear();
      //这里向arrayList填入数据,略过
    }然后调用Adapter.notifyDataSetChanged()就有效果了。
      

  4.   

    代码 用【code] [/code] 楼上几位 , 贴出乱成一片的东西给谁看呢 
      

  5.   

    [code] class MyJava{}
    [/code]
      

  6.   

    问题出在 mData = getData();这里。mData是你adapter绑定的数据,而mData = getData();将其重新赋值,那么mData就不再是原来的mData,adapter不再对其有引用关系。所以这个时候mData的改变不再关adapter的事了。你可以如#5楼所讲,使用一个临时变量保存 temp = getData()中的数据,然后将mData原有的数据清空,再将temp中的数据加到mData中,这样adapter对mData的引用关系仍在,adapter.notifyDataSetChanged()就能得到响应。