好的,这就是我的情景:
我正在使用JSON开发聊天(我们现在没有Jabber服务器)。有一项服务要求每30秒发送一次新的聊天消息:
public class ChatService extends Service {
ArrayList<NameValuePair> params;
int subnotid;
String urlaskmessages;
String response;
ArrayList<String> mensajes;
Timer timer=new Timer();
@Override
public void onCreate() {
super.onCreate();
subnotid=General.subnotid;
urlaskmessages=getString(R.string.host)+getString(R.string.appnamespace)+getString(R.string.chatpedir);
mensajes=new ArrayList<String>();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.i("CHAT", "Llamamos al servicio ChatService");
llamarServicio();
}
}, 0, 30000);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void llamarServicio(){
Thread thread=new Thread(){
public void run(){
params=new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("subnotid", String.valueOf(subnotid)));
try {
response=CustomHttpClient.executeHttpPost(urlaskmessages, params);
mensajes=parseJSON(response);
if(mensajes!=null){
General.mensajes.clear();
for (int i=0;i<mensajes.size();i++){
General.mensajes.add(i, mensajes.get(i));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private ArrayList<String> parseJSON(String resp) {
//General.mensajes=new ArrayList<String>();
mensajes=new ArrayList<String>();
JSONObject total;
try {
total = new JSONObject(resp);
Log.i("JSON","Respuesta recibida: "+resp);
JSONObject paso1=new JSONObject(total.getString("chat"));
JSONArray paso2=new JSONArray(paso1.getString("mensajes"));
//JSONArray paso3=new JSONArray(paso2.getString("mensaje"));
for (int i=0;i<paso2.length();i++){
JSONObject jobj=paso2.getJSONObject(i);
mensajes.add(i,jobj.getString("mensaje"));
Log.i("JSON","Añadido objeto: "+paso2.getString(i));
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mensajes;
}
};
thread.start();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("CHAT", "ChatService destruido");
timer.cancel();
}
}
正如你所看到的,我从服务器接收响应,解析JSON,并返回一个包含所有消息的ArrayList,它存储在Singleton类中,我存储了一些值(这就是为什么一般.mensajes)。 当另一个Activity打开并执行其职责(发送LatLng对象)时,所有这些都会发生。当用户收到新消息时,该活动必须做出反应,并打开聊天活动:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try{
if(General.mensajes.size() > numerodemensajes && General.chatabierto==false){
Intent chat=new Intent(c, ChatActivity.class);
General.AzafataChat=false;
startActivity(chat);
}
}catch(Exception e){
e.printStackTrace();
}
numerodemensajes=General.mensajes.size();
}
}, 0, 10000);
在ChatActivity中,我有一个处理程序来响应新消息的到达,并分配Adapter ::
mHandler.post(new Runnable() {
public void run() {
madapter = new MessageAdapter(getApplicationContext(), 0, General.mensajes);
setListAdapter(madapter);
}
});
最后,适配器:
public class MessageAdapter extends ArrayAdapter {
private final Context context;
//private final ArrayList<Message> list;
private final ArrayList<String>list;
private Bitmap x;
String remitente;
String message;
String remite;
String mensaje;
private int numberOfItems;
@SuppressWarnings("unchecked")
public MessageAdapter(Context context, int textresourceViewid,
ArrayList<String> messages) {
super(context, textresourceViewid, messages);
this.context = context;
this.list = messages;
}
@Override
public int getCount() {
return this.list.size();
}
@Override
public Object getItem(int position) {
return this.list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
numberOfItems=list.size();
try {
message = list.get(position);
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
//ViewHolder holder=new ViewHolder();
if (v == null) {
if (message.split(":")[0].equals("personal")){
//holder=new ViewHolder();
Log.i("CHAT", "En la lista hay "+list.size()+" mensajes");
Log.i("CHAT", "El mensaje dice: "+list.get(0).split(":")[1]);
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.chatsenderlayout, null);
if (message != null) {
TextView texto=(TextView)v.findViewById(R.id.textaza);
texto.setText(message);
}
}else{
Log.i("CHAT", "Estamos en el else");
//holder=new ViewHolder();
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.chatazafatalayout, null);
if (message != null) {
TextView texto=(TextView)v.findViewById(R.id.textaza);
texto.setText(message);
}
}
}
return v;
}
public int getLastIndex() {
int last = 0;
if (!list.isEmpty()) {
last = list.size() - 1;
}
return last;
}
}
毕竟这个问题:
当ChatActivity打开时,它只显示最后5条消息...重复,我的意思是:如果ArrayList中有12条消息,则ChatActivity显示12条消息,但只显示最后5条消息:8,9,10 ,11,12,8,9,10,11,12,8,9。
我对此感到生气......我认为它应该可以正常工作,但事实并非如此。有人可以帮帮我吗?
我知道它有点(或很多......)凌乱。如果你不明白,可以随意提问。
非常感谢。
答案 0 :(得分:1)
在你的适配器getView方法中,你有一个v == null的传递,但是当v不为null时没有路径,所以当listview看到回收时,传递给你的getView方法的convertView参数不为null ,您的方法不执行任何操作,因此显示上一个视图(显示旧的行数据)。您需要添加v!= null的情况,并相应地更新现有视图。