listview想单独更新一行的某一个textview的文字,应该怎么实现? RT ,现在这个事件更改的前提条件不是我应用能够控制的, 是一条服务器推送消息, 当我的后台服务得到这个推送通知后广播出来,在activiey里面注册一个广播接收者接收这个消息,然后需要根据这个推送通知里面的数据更改 listview指定某行的一个文本, 这个应该怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 更新map中的数据就行,然后调用一下数据更新方法notifyDataSetChanged 你这个是整个listview全部刷新了, 这样肯定会给用户不好的用户体验,因为你一刷就要么刷到最上面,要么刷到最下面, 用户在中间看着呢,你啪一下给人家刷没了,肯定是不可以的,要是这么简单的话就不在这发了 下面是我看你问题写的,不知道,是不是你想要的结果:所以先把数据放到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; }} 如果在可见区域,那你用下面方法更新吧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);// 从子级中获得控件} 刷新肯定是不可以的, 你这种做法 我可以这么理解吗? 就是通过listview实例来获取指定行再获取textview,然后直接修改, 我先试试这种做法可行不 我觉得还是可以notifyDataSetChanged(),并且保存当前ListView的当前位置,刷新完以后再跳到之前的位置,4楼的办法可以刷新可见的item,但是不可见的item的话岂不是不能刷新呢?仅供参考。 我觉得还是可以notifyDataSetChanged TabHost控件使用Intent创建子页面,TabActivity如何获取页面的内容 android如何将 buffer显示视频 GPS到底如何关闭啊? android 页面布局问题 ImageView 如何自适应屏幕? 我想在程序进入logo界面的时候加载主界面的数据 手机怎么查看QQ记住的密码? 自定义 view 边框处画横线总是少 1 像素 第三方清理工具导致进程被Kill Android中怎么把数组存进数据库,求高手解答啊 用下面的代码建了两个菜单,但是按下Menu键后还会自动出一个Settings的菜单是怎么回事? 更新Android开发环境后,写程序就没有图标了
下面是我看你问题写的,不知道,是不是你想要的结果:
所以先把数据放到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;
}
}
如果在可见区域,那你用下面方法更新吧
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);// 从子级中获得控件
}
刷新肯定是不可以的, 你这种做法 我可以这么理解吗? 就是通过listview实例来获取指定行再获取textview,然后直接修改, 我先试试这种做法可行不