2016-06-04 5 views
0

У меня есть MainActivity с фрагментом, состоящим из двух вкладок с одним фрагментом на каждой вкладке (ChatListFragment и FriendListFragment). Каждый фрагмент имеет ListView. Когда пользователь нажимает на каждую строку ListView, отображает ChatActivity.onActivityResult requestCode возвращает 0

Я хотел, чтобы ListView (со списком в качестве адаптера, который вызывает ChatActivity) в ChatListFragment обновил свой ListView после закрытия ChatActivity. Я попробовал метод onActivityResult, как показано ниже в моем коде, но requestCode всегда равен -1.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    ... 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.d(TAG, "onActivityResult: " + " " + requestCode + " == " + MYACTIVITY_REQUEST_CODE + " and " + resultCode + " == " + Activity.RESULT_OK); 
     Log.d(TAG, "onActivityResult: " + MainActivity.class.getSimpleName()); 

     for (Fragment fragment : getSupportFragmentManager().getFragments()) { 
      fragment.onActivityResult(requestCode, resultCode, data); 
     } 
    } 

    ... 
} 

ChatListFragment.java

public class ChatListFragment extends Fragment { 

    ... 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.d(TAG, "onActivityResult: " + TAG); 
     Log.d(TAG, "onActivityResult: " + " " + requestCode + " == " + MYACTIVITY_REQUEST_CODE + " and " + resultCode + " == " + Activity.RESULT_OK); 
     if ((requestCode == MYACTIVITY_REQUEST_CODE) && (resultCode == Activity.RESULT_CANCELED)) { 
      List<Friend> friendList = getFriendChatList(); 
      adapter = new ListAdapter(getActivity(), R.layout.fragment_list, friendList, true); 
      adapter.notifyDataSetChanged(); 
      listView.setAdapter(adapter); 
      Log.d(TAG, "onActivityResult number of friend chats: " + getFriendChatList().size()); 
      if(friendList.isEmpty()) { 
       linearLayout.setVisibility(View.VISIBLE); 
      } else { 
       linearLayout.setVisibility(View.GONE); 
      } 
     } 
    } 
} 

ChatActivity.java

public class ChatActivity extends AppCompatActivity { 

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

     ... 

     if (getParent() == null) { 
      setResult(Activity.RESULT_OK); 
     } else { 
      getParent().setResult(Activity.RESULT_OK); 
     } 
    } 

    ... 
} 

ListAdapter.java

public class ListAdapter extends ArrayAdapter<Friend> { 

    private static final int MYACTIVITY_REQUEST_CODE = 9000; 

    public ListAdapter(Context context, int resource, List<Friend> objects, boolean isChat) { 
     super(context, resource, objects); 
     this.context = context; 
    } 

    @Override 
    public View getView(final int position, final View convertView, ViewGroup parent) { 
     View view = convertView; 
     LayoutInflater layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if(null == view) { 
      view = layoutInflater.inflate(R.layout.list_friend, null); 
     } 

     final Friend friend = friendList.get(position); 

     if(null != friend) { 
      final CardView rowLayout = (CardView) view.findViewById(R.id.row_layout); 
      final ImageView friendImage = (ImageView) view.findViewById(R.id.list_friend_image); 
      final TextView friendName = (TextView) view.findViewById(R.id.list_friend_name); 
      final TextView friendDescription = (TextView) view.findViewById(R.id.list_friend_description); 
      final TextView friendLastChatTime = (TextView) view.findViewById(R.id.list_friend_lastChatTime); 

      // Open chat activity 
      rowLayout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent intent = new Intent(context, ChatActivity.class); 
        intent.putExtra(KEY_FRIEND_NAME, friend.getName()); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        ((Activity) context).startActivityForResult(intent, MYACTIVITY_REQUEST_CODE); 
       } 
      }); 
     } 

     return view; 
    } 
} 
+0

Можете ли вы поделиться кодом, в котором вы звоните в ChatActivity? – Aradhna

+0

Добавлен код ListAdapter для вашей справки :) – stackyyflow

ответ

1

Вам нужно сделать намерение, а затем установить результат этого намерения.

Попробуйте что-нибудь подобное в вашем ChatActivity

Intent intent=new Intent(); 

if (getParent() == null) { 
      setResult(Activity.RESULT_OK,intent); 
     } else { 
      getParent().setResult(Activity.RESULT_OK,intent); 
     } 

     finish(); 

Вы также должны finish ваш ChatActivity после установки результата. Пример:

Что я не понимаю, почему вам нужно проверить родительский класс. Вы всегда можете просто так делать

Intent intent= new Intent(); 
setResult(RESULT_OK,intent); 
finish(); 

И это должно работать должным образом.

Надеюсь, что это поможет :)

+0

Благодарим за помощь, но это не сработало :( – stackyyflow

+0

Пожалуйста, проверьте изменения. – Aradhna

+0

Я понял, что smth, onActivtyResult всегда вызывается первым до setResult, вызывая resultCode! = Activity.RESULT_OK:/ – stackyyflow

Смежные вопросы