簡體   English   中英

如何將數據數組列表從片段傳遞回其Activity

[英]How to pass array list of data from fragment back to its Activity

我有一個活動,我啟動了一個片段以選擇一些列表,選擇之后,我想獲得片段中所選事物的列表。

我用了onActivityResult() ... !! 但這不起作用!

請幫忙!

這是我的活動代碼:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private RecyclerView foldersRV;
    private RecyclerView.Adapter foldersAdapter;
    private AppCompatButton addFolderBtn;
    private AppCompatTextView hiddenText;
    private List<String> selectedFoldersToHide = new ArrayList<>();
    private static final int REQ_FOR_FOLDERS = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        addFolderBtn = (AppCompatButton) findViewById(R.id.add_folder_btn);
        hiddenText = (AppCompatTextView) findViewById(R.id.hidden_text_view);

        foldersRV = (RecyclerView) findViewById(R.id.folders_list_recycler_view);
        foldersRV.setVisibility(View.GONE);
        hiddenText.setVisibility(View.VISIBLE);

        addFolderBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add_folder_btn:
                moveToFragment(new FoldersHiddenFragment(), "Add Folders Fragment");
        }
    }

    private void moveToFragment(Fragment toFragment, String TAG) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG);
        if (fragment != null && fragment.isVisible()) {
            System.out.println("*** ALREADY there ****");
        } else {
            transaction.replace(R.id.main, toFragment, TAG);
            transaction.addToBackStack(null).commit();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == REQ_FOR_FOLDERS) {
            selectedFoldersToHide = data.getStringArrayListExtra("FOLDERS_TO_HIDE");
        }
    }

}

下面是我的片段代碼:

public class FoldersHiddenFragment extends Fragment {
    private View allFoldersView;
    private RecyclerView foldersRV;
    private RecyclerView.Adapter foldersAdapter;
    private AppCompatButton hideFoldersBtn;
    private ArrayList<String> selectedFoldersToHide = new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        allFoldersView = inflater.inflate(R.layout.folders_hidden_fragment_view, container, false);
        initView();
        return allFoldersView;
    }

    private void initView() {
        foldersRV = (RecyclerView) allFoldersView.findViewById(R.id.folders_list_recycler_view);
        foldersRV.setHasFixedSize(true);
        foldersRV.setLayoutManager(new LinearLayoutManager(getActivity()));
        MyFiles myFiles = new MyFiles();

        foldersAdapter = new FoldersAdapter(getActivity(), myFiles.getAllDirectoriesNames(), new FoldersAdapter.FileInterface() {
            @Override
            public void getFilesSelected(List<String> folderSelectedList) {
                selectedFoldersToHide = (ArrayList<String>) folderSelectedList;
            }
        });
        foldersRV.setAdapter(foldersAdapter);
        foldersAdapter.notifyDataSetChanged();

        hideFoldersBtn = (AppCompatButton) allFoldersView.findViewById(R.id.hide_folder_btn);

        hideFoldersBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("******** TOTAL SELECTED: " + selectedFoldersToHide.size());
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.putStringArrayListExtra("FOLDERS_TO_HIDE", selectedFoldersToHide);
                getActivity().setResult(RESULT_OK, intent);
                getActivity().getSupportFragmentManager().popBackStack();
            }
        });
    }
}

創建一個接口,說PassArrayList並在Activity實現它。

 public interface passArrayList {
        public void onItemsSelected(List<String> selectedItems);           
}

public class MainActivity extends AppCompatActivity implements passArrayList{
    // ...
    @override
    public void onItemsSelected(List<String> selectedItems){
      //your code goes here
    } 
}

在您的片段中,添加以下內容:

PassArrayList mCallback;

@Override
public void onAttach(Activity activity) {
   super.onAttach(activity);
   mCallback = (PassArrayList) getActivity();
}

@Override
public void onDetach() {
   super.onDetach();
   mCallback = null;
}

在代碼中的某處,當您要將歌曲列表傳遞回Activity請調用mCallback對象上的mCallback onItemsSelected()方法,並將ArrayList傳遞給此方法。 然后,此ArrayList將作為Activity方法onItemsSelected()的參數來使用,您可以使用它進行任何所需的操作。 但不要忘記在onDetach()掛鈎方法中取消指向mCallback鏈接,以防止上下文泄漏。

1)這是一個將數據從片段傳遞到活動的基本示例:

在片段A中

((ParentActivity)getActivity()).dispatchInformations(list);

在ParentActivity中

public void dispatchInformations(List dataList){

}

2)或創建一個接口並在活動中實現 ,將引用傳遞給片段並在活動中獲得結果。

最簡單的方法是使用EventBus

public static class MessageEvent { /* your arraylist here */ }
//Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode in Activity:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};
// send event from your Fragment
 EventBus.getDefault().post(new MessageEvent(YourArrayList));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM