0

好的,这是我的场景:

我正在开发一个聊天,使用 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 类中,我在其中存储一些值(这就是 General.mensajes 的原因)。所有这些都发生在另一个 Activity 打开并执行其职责(发送 LatLng 对象)时。该 Activity 必须在用户收到新消息时做出反应,并打开聊天 Activity:

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。

我对此感到生气......我认为它应该可以正常工作,但事实并非如此。任何人都可以帮助我吗?

我知道这有点(或很多......)混乱。如果你不明白的东西随时问。

非常感谢。

4

1 回答 1

1

在您的适配器 getView 方法中,当 v == null 时,您有一个传递,但当 v 不为 null 时没有路径,因此当列表视图确实查看回收,并且传递给您的 getView 方法的 convertView 参数不为 null 时,您的方法什么都不做,所以显示前一个视图(显示旧行数据)。您需要添加 v != null 的情况,并相应地更新现有视图。

于 2013-05-23T15:40:59.587 回答