ArrayAdapter无法正常工作

时间:2013-05-23 15:30:50

标签: android android-arrayadapter

好的,这就是我的情景:

我正在使用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。

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

我知道它有点(或很多......)凌乱。如果你不明白,可以随意提问。

非常感谢。

1 个答案:

答案 0 :(得分:1)

在你的适配器getView方法中,你有一个v == null的传递,但是当v不为null时没有路径,所以当listview看到回收时,传递给你的getView方法的convertView参数不为null ,您的方法不执行任何操作,因此显示上一个视图(显示旧的行数据)。您需要添加v!= null的情况,并相应地更新现有视图。