RT ,现在这个事件更改的前提条件不是我应用能够控制的,  是一条服务器推送消息,  当我的后台服务得到这个推送通知后广播出来,在activiey里面注册一个广播接收者接收这个消息,然后需要根据这个推送通知里面的数据更改  listview指定某行的一个文本,  这个应该怎么实现?

解决方案 »

  1.   

    更新map中的数据就行,然后调用一下数据更新方法notifyDataSetChanged
      

  2.   

    你这个是整个listview全部刷新了, 这样肯定会给用户不好的用户体验,因为你一刷就要么刷到最上面,要么刷到最下面, 用户在中间看着呢,你啪一下给人家刷没了,肯定是不可以的,要是这么简单的话就不在这发了
      

  3.   


    下面是我看你问题写的,不知道,是不是你想要的结果:
    所以先把数据放到List里面,然后针对你接到的通知,去修改list里面的值,去固定修改哪一行(也就是list里面某个地址的值,那样的话,顺序就不会改变。  下面的代码不适合删除,如果删除,顺序就会发生改变,那么就要做其他操作了),但还是要刷新adapter。package com.test;import java.util.ArrayList;
    import java.util.List;import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.AbsListView;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;public class TestActivity extends Activity{ ListView listView = null;
    private List<String> list = null;

    private Context context;

    private Thread thread;

    private String[] str ={"あ","い","う","え","お","か","き","く","け","こ"};

    private TextAdapter adapter = null;

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.list);
    context = this;

    listView = (ListView)findViewById(R.id.listView);

    list = getData();

    adapter = new TextAdapter();

    listView.setAdapter(adapter);

    thread = new Thread(new MyThread());

    thread.start();
    }


    class TextAdapter extends BaseAdapter{

    public int getCount() {
    return list.size();
    } public Object getItem(int position) {
    return position;
    } public long getItemId(int position) {
    return position;
    } public View getView(int position, View convertView, ViewGroup parent) {

    TextView view = new TextView(context);

    view.setGravity(Gravity.CENTER_VERTICAL);

    view.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.FILL_PARENT, 50));

    view.setText(list.get(position));

    return view;
    }
    }


    int count = 0;
    int count1 = 0;

    MyHandler handler = new MyHandler();

    class MyThread implements Runnable{
    public void run() {

    while(!Thread.currentThread().isInterrupted()){
    try {
    Thread.sleep(4000);
    } catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    }

    if(count < 10 && count < str.length){
    list.set(count, str[count]);
    count++;
    }else{
    if(count1<10){
    list.set(count1, "こんちは"+count1);
    count1++;

    if(count1==10){
    count = 0;
    count1 = 0;
    }
    }
    }

    Message msg = new Message();

    msg.what =1;

    handler.sendMessage(msg);
    }
    }
    }

    class MyHandler extends Handler{
    public void handleMessage(Message msg) {
    super.handleMessage(msg);

    if(msg.what==1){
    if(adapter!=null){
    adapter.notifyDataSetChanged();
    }
    }
    }
    }

    private List<String> getData(){
    List<String> list = new ArrayList<String>();

    for(int i=0;i<10;i++){
    list.add("こんちは"+i);
    }

    return list;
    }
    }
      

  4.   


    如果在可见区域,那你用下面方法更新吧
    ListView lstres = (ListView)findViewById(R.id.ListView); for (int i = 0; i < lstres.getChildCount(); i++) {
       RelativeLayout ll = (RelativeLayout)lstres.getChildAt(i);// 获得Item布局,i就是item的位置
       editText= (EditText) ll.findViewById(R.id.image);// 从子级中获得控件
    }
      

  5.   


    刷新肯定是不可以的, 你这种做法 我可以这么理解吗?  就是通过listview实例来获取指定行再获取textview,然后直接修改, 我先试试这种做法可行不
      

  6.   

    我觉得还是可以notifyDataSetChanged(),并且保存当前ListView的当前位置,刷新完以后再跳到之前的位置,4楼的办法可以刷新可见的item,但是不可见的item的话岂不是不能刷新呢?仅供参考。
      

  7.   

    我觉得还是可以notifyDataSetChanged