2017-05-31 17 views
-1

私はすでに自分のコードで疲れています。私はチャットアプリケーションを書いています。私のアプリは2つの活動で構成されています。最初のアクティビティには、各行にユーザに送信された最後のメッセージが含まれ、2番目のアクティビティには会話全体が含まれているリストビューがあります。私のアプリでは、Android用にsocket.ioを使用しました。私のアプリは正常に動作します。リストビューは、データが受信されたときにリフレッシュされますが、戻るボタンを押してからアクティビティに戻ると、リストビューはそれ自体をリフレッシュしません。ログコンソールでは、データが受信され、 "変更された"メソッドが呼び出されたが、リストビューは更新されないことがわかります。 belowsコードで何が間違っていますか?戻るボタンを押してアクティビティに戻ると、リストビューが更新されないのはなぜですか?

package com.example.seadog.fb_dialog; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.TextView; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.net.URISyntaxException; 
import java.util.ArrayList; 

import io.socket.client.IO; 
import io.socket.client.Socket; 
import io.socket.emitter.Emitter; 

public class MainActivity extends Activity { 

    public static ArrayList arrayList = new ArrayList(); 

    public ListView listView; 
    public MyBaseAdapter adapter; 

    public TextView textView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     /* 
     * Get Socket.io Object 
     */ 

     SocketIO socketIo = new SocketIO(); 

     Socket mSocket = socketIo.getSocket(); // get socket 
     Integer id = socketIo.getId();   // get Website ID 

     if(mSocket == null) { 

      socketIo.Connection(); 
      mSocket = socketIo.getSocket(); 

      mSocket.on("message", new Emitter.Listener() { 

      /* 
      * Message Listener 
      */ 

       @Override 
       public void call(Object... args) { 

        Boolean isset = false; 

        try { 

         JSONObject object = (JSONObject) args[0]; 


         String _id = object.getString("_id"); 
         String message = object.getString("message"); 

         JSONObject obj = new JSONObject(); 
         obj.put("direction", "fb-lt"); 
         obj.put("message", message); 
         obj.put("date", "2017-05-29T12:15:49.245Z"); 


         for(int i = 0; i < arrayList.size(); i++){ 

          ListData ld = (ListData) arrayList.get(i); 
          String id = ld.getId(); 

          if(_id.equals(id)){ 

           JSONArray Data = ld.getData(); 
           Data.put(obj); 
           ld.setDescription(message); 

           arrayList.set(i, ld); 

           isset = true; 

           Log.d("LOG", message); 
          } 

         } 

         if(!isset) { 

          JSONArray jsonArray = new JSONArray(); 
          jsonArray.put(obj); 

          ListData ld = new ListData(); 
          ld.set_id(_id); 
          ld.setID(1); 
          ld.setTitle("Klient:"); 
          ld.setDescription(message); 
          ld.setData(jsonArray); 

          arrayList.add(ld); 

         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

        changed(); 

       } 

      }); 

     } 

     /* 
     * Populate a listview 
     */ 

     listView = (ListView) findViewById(R.id.listView); 
     adapter = new MyBaseAdapter(this, arrayList); 
     listView.setAdapter(adapter); 

     /* 
     * OnItemClickListener 
     */ 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       Intent intent = new Intent(MainActivity.this, Conversation.class); 
       intent.putExtra("item", position); 
       startActivity(intent); 

       TextView textView = (TextView) view.findViewById(R.id.descitem); 
       textView.setTypeface(null, Typeface.NORMAL); 

      } 

     }); 

     textView = (TextView) findViewById(R.id.count); 

    } 

    private void changed() { 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       adapter.notifyDataSetChanged(); 
       Log.d("LOG:", "adapter refresh"); 
      } 
     }); 

    } 

} 

MyBaseAdapterクラス:

package com.example.seadog.fb_dialog; 

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.Log; 
import android.util.TypedValue; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class MyBaseAdapter extends BaseAdapter { 

    Context context; 
    ArrayList<ListData> items = new ArrayList(); 
    LayoutInflater inflater; 

    int id = 0; 

    public MyBaseAdapter(Context context, ArrayList items) { 
     this.context = context; 
     this.items = items; 
     inflater = LayoutInflater.from(this.context); 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public ListData getItem(int position) { 
     return items.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     MyViewHolder mViewHolder; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_item, parent, false); 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 

     ListData currentListData = getItem(position); 

     id = position > 0 ? getItem(position - 1).getID() : 0; 

     mViewHolder.Title.setText(currentListData.getTitle()); 
     mViewHolder.Desc.setText(currentListData.getDescription()); 

     if(1==1){ 

      mViewHolder.Title.setVisibility(View.GONE); 

     }else { 

      if (id != currentListData.getID()) { 
       mViewHolder.Title.setVisibility(View.VISIBLE); 
      } else { 
       mViewHolder.Title.setVisibility(View.GONE); 
      } 

     } 

     return convertView; 
    } 

    private class MyViewHolder { 
     TextView Title, Desc; 

     public MyViewHolder(View item) { 
      Title = (TextView) item.findViewById(R.id.txtitem); 
      Desc = (TextView) item.findViewById(R.id.descitem); 

      Typeface title = Typeface.createFromAsset(context.getAssets(), "fonts/DroidSans.ttf"); 
      Title.setTypeface(title); 

      Typeface desc = Typeface.createFromAsset(context.getAssets(), "fonts/DroidSans.ttf"); 
      Desc.setTypeface(desc, Typeface.BOLD); 
     } 
    } 
} 

答えて

0

オーバーライドonResume()方法及びその

adapter = new MyBaseAdapter(this, arrayList); 
listView.setAdapter(adapter); 
+0

残念ながら動作しません。私は何が間違っているのか分からない。私はonResume、onStart、onRestart、何も試していません。 MainActivityに戻ると、リストビューは更新されませんが、この状況は、戻るボタンを使用した場合にのみ発生します。家庭やカードを使用してからカードやアイコンから戻ってくるときは発生しません。わかりません。助けて。 – SeaDog

+0

アプリケーションを起動して2番目のアクティビティから戻ると、BaseAdapterクラスが呼び出されていることに気付きました。戻りボタンをクリックしたときにアプリケーションに戻るときに呼び出されることはありません。私はLayoutInflaterを使用しています、多分これはここで問題ですか? arrayListは、 "set"を使用して変更された1つのフィールドによって変更されます。 – SeaDog

+0

MyBaseAdapterクラスコードを入力します。 –

0

の下に行の下に入れて、あなたが戻ってこの活動にあなたの後に任意のコールバックを持っていませんでした。

onResume()メソッドまたはstartActivityForResultをオーバーライドして、onAcitvityForResultメソッドで何かを実行できます。