Массив от действия к фрагменту, чтобы показать список - PullRequest
0 голосов
/ 26 апреля 2018

Добрый день,

Если я объявил arraylist в основной деятельности и заполнил значения по умолчанию в списке, и я хотел бы отобразить его на фрагменте в пользовательском списке, как бы я получил доступ к своему списку вфрагмент?

Спасибо

 users = new ArrayList<Users>();

Во фрагменте

// how do I find the arraylist here?
 UserAdapter<User> adapter = new UserAdapter<User> (getContext().user);

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Сначала создайте в своей деятельности метод, который возвращает ArrayList.

public ArrayList<User> getUsers() {
    return users;
}

Затем в своем фрагменте вам нужно использовать метод getActivity() для доступа к своей деятельности.Отсюда вы можете привести вызов к конкретному действию, чтобы получить доступ к его методам.Таким образом, ваш вызов будет выглядеть примерно так:

ArrayList<User> users = ((MainActivity)getActivity()).getUsers();
UserAdapter<User> adapter = new UserAdapter<User>(users);

Редактировать: я собираюсь показать другой способ сделать это, чтобы избежать связи фрагмента с действием.В первом примере вам необходимо использовать конкретное действие для получения списка пользователей ArrayList.Этот вид поражает назначение фрагмента, которое заключается в его повторном использовании.Этот фрагмент не сработает сразу, если вы поместите его в другое действие, потому что он привязан конкретно к MainActivity через приведенный вызов getActivity().

Лучший способ сделать это - создать интерфейс внутри вашего фрагмента, а затем выполнить любое действие, к которому он присоединен, для реализации этого интерфейса.Это позволит вам добавить фрагмент к любому действию, которое реализует этот интерфейс без изменения кода фрагмента.

Наш фрагмент будет выглядеть так:

public class ExampleFragment {

    //Create the interface that will be used to communicate with the
    //Activity. For simplicity, we'll just call it UsersProvider.
    //Whichever Activity uses this Fragment will implement this interface.
    public interface UsersProvider {
        public ArrayList<User> getUsers();
    }

    //Our UsersProvider reference. 
    private UsersProvider usersProvider;

    //Here is where we'll set the Activity as our UsersProvider.
    //We're still calling getActivity(), but we're not casting it to
    //any specific Activity, rather we're casting it as the interface.
    @Override 
    public void onAttach(Context context) {
        usersProvider = (UsersProvider) getActivity();
    }

    // onCreate, onCreateView etc... goes here
}

Наша деятельность будет выглядеть так:

public class MainActivity extends Activity implements ExampleFragment.UsersProvider {

    //It's assumed that this is set somewhere else in the acitivty.
    private ArrayList<User> users;

    //onCreate, etc...

    //Implement the method from UsersProvider interface
    @Override 
    public ArrayList<User> getUsers() {
        return users;
    }
}

Итак, теперь это настроено так, что ваш фрагментможет быть использован из любой деятельности без изменения кода в вашем фрагментеПросто выполните действие, реализующее интерфейс UsersProvider, и вы сможете получить доступ к своему ArrayList пользователя в своем фрагменте, вызвав

ArrayList<User> users = usersProvider.getUsers();
0 голосов
/ 26 апреля 2018

В деятельности:

Bundle bundle = new Bundle();
// Put the list in a bundle
bundle.putParcelableArrayList("users", users);
YourFragmentClass fragment = new YourFragmentClass();
fragment.setArguments(bundle);

Во фрагменте:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Get the list
    List<Users> users = getArguments().getParcelableArrayList("users"); 
    return inflater.inflate(R.layout.fragment, container, false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...