2016-08-09 66 views
1

Ein Gewinde an einer onCreate Methode Geschichte von Server zu erhalten Chat auf Listview zu setzen, wird der Code unten angegeben:Listview erhalten automatisch nach oben, nachdem alle 2 Sekunden

Runnable run = new Runnable() { 
     public void run() { 
      // new Comments(false).execute(); 
      new GetChatFromServer().execute(); 
      handler.postDelayed(this, 1600); 
     } 
    }; 
    runOnUiThread(run); 

Es zu GetChatFromServer Klasse ruft zu bekommen Der letzte aktualisierte Chat-Verlauf funktioniert gut, aber das Problem ist, dass wenn ich in der Listenansicht nach unten scrolle, es automatisch nach oben scrollte.

class GetChatFromServer extends AsyncTask<String, Integer, Double> { 

     String chathistory; 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 

      System.out.println("My url is>>>>" + chatHistoryUrl); 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected Double doInBackground(String... params) 
       throws ArrayIndexOutOfBoundsException { 

      ServiceHandler sh = new ServiceHandler(); 
      // Making a request to url and getting response 
      String jsonStr = sh.makeServiceCall(chatHistoryUrl, 
        ServiceHandler.GET); 
      chathistory = "{\"chatHistories\":" + jsonStr + "}"; 
      Gson gson = new Gson(); 
      Type listType = new TypeToken<List<ChatHistory>>() { 
      }.getType(); 
      chatHistories = (ArrayList<ChatHistory>) gson.fromJson(jsonStr, 
        listType); 
      // ChatModel res = gson.fromJson(chathistory, ChatModel.class); 

      return null; 
     } 

     protected void onProgressUpdate(Integer... progress) { 
      // pb.setProgress(progress[0]); 
     } 

     @Override 
     protected void onPostExecute(Double result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      mAdapter = new ChatMessageAdapter(ChatMainActivity.this, 
        chatHistories, sourceId); 
      chatList.setAdapter(mAdapter); 

     } 

    } 

Bitte, wenn jemand zu meinem Problem helfen kann. Danke im Voraus.

Antwort

0

Problem ist, dass Sie Adapter jedes Mal neu erstellen. Initialisieren Adapter einmal und ersetzen Sie die Daten nur in Ihrem OnPostExecute

List chatHistories; 



    // in onPostExecute 
adapter.updateData(new_chatHistory); 




// in your adapter 
updateData(List new_chatHistory){ 

    chatHistories.addAll(new_chatHistory); 

    and adapter.notifyDataSetChanged(); 
} 
4

Das Problem ist hier

@Override 
protected void onPostExecute(Double result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    mAdapter = new ChatMessageAdapter(ChatMainActivity.this, 
      chatHistories, sourceId); 
    chatList.setAdapter(mAdapter); 

} 

Ihr Aufruf setAdapter immer wieder, wenn Sie Daten vom Server holen, was Sie tun müssen, wird Adapter in OnCreate und rufen Sie mAdapter.notifyDataSetChanged immer wenn Sie Daten abrufen. Hier

ist das Beispiel:

String chathistory; 
ChatMessageAdapter mAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ........ 
    mAdapter = new ChatMessageAdapter(ChatMainActivity.this, chatHistories, sourceId); 
    chatList.setAdapter(mAdapter); 
} 

und in onPostExecute

@Override 
protected void onPostExecute(Double result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    mAdapter.notifyDataSetChanged(); 
} 
+0

hatte ich umgesetzt, aber es ist nicht working.anyway danken für die Unterstützung. –