Как передать ArrayList из пользовательского адаптера во фрагмент - PullRequest
0 голосов
/ 01 июля 2019

У меня есть созданный фрагмент, который, в свою очередь, загружает две вкладки с отдельными фрагментами (студенты и вопросы).Эти два фрагмента представляют собой два ListView: один с именем студента и флажком, а другой с некоторыми вопросами.

Мне нужно знать, какие студенты из ListView проверяются.Это я легко получаю с ArrayList в пользовательском адаптере.Я назвал selectedStudents.

Но теперь я хочу передать ArrayList selectedStudents с проверенными студентами в основной фрагмент.Но я не могу этого сделать.

Это мой код:

MainClass:

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                listaAlumnos = (ListView)findViewById(R.id.listViewAlumnosF);
        listaCuestiones = (ListView)findViewById(R.id.listViewCuestionesF);

//HERE I WANT TO READ THE ARRAYLIST WITH STUDENTS CHECKED

            }
        });
}


@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main2, container, false);

            return rootView;
        }

Фрагмент моего ученика:

public class StudentsFragment extends Fragment {

ListView listStudentsF;
ArrayList<String> IdAlumnos = new ArrayList<String>();

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_alumnos, container, false);
        listStudentsF = (ListView)v.findViewById(R.id.listStudentsF);

perform();

}


public void perform() {
            myAdapterUsers myAdapterUsers = new myAdapterUsers(getActivity(), R.layout.list_item_alumnos, IdAlumnos);
            listStudentsF.setAdapter(myAdapterUsers);
    }
}

И мойПользовательский адаптер (метод getView):

@Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {

View v = convertView;

 LayoutInflater layoutInflater = LayoutInflater.from(this.contextM);
        v = layoutInflater.inflate(R.layout.list_item_alumnos, null);

final String currentIdAlumnos = IdAlumnos.get(position);

final CheckBox checkBox = v.findViewById(R.id.checkBox2);

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

                //Comprueba si está checkeado el registro y lo añade o quita a un ArrayList de usuarios seleccionados.
                if (isChecked){
                    selectedStudents.add(currentIdAlumnos);
                }else {
                    selectedStudents.remove(currentIdAlumnos);
                }

                Log.e("SELEC: ", String.valueOf(selectedStudents));

            }
        });

return v;
}

Я пытаюсь создать метод в адаптере, например:

  public ArrayList<String> getArrayList() {
        return selectedStudents;
    }

И вызывается из внешнего Activity, но не работает.

1 Ответ

1 голос
/ 01 июля 2019

Начнем с того, что общение между фрагментами должно осуществляться с использованием родительского действия, интерфейса и некоторого связующего кода.Об этом спрашивали несколько раз, и это также Раздел документации Google .

С учетом всего вышесказанного то, что я бы сделал в вашем случае, это отделить данные от представлений.

Ваш список выбранных студентов не должен жить илибыть измененным во фрагменте действия или .

Ваша активность (и ее фрагменты) являются просто контейнерами и делегатами политики (если я могу использовать терминологию Google) для какой Androidв качестве основы предлагает.Вы не можете иметь приложение для Android без них (по крайней мере, приложение, которое отображает пользовательский интерфейс), поэтому вы должны иметь их рядом.Но это не значит, что весь ваш код должен там жить.

Это далеко не так.Действия и фрагменты сами по себе сложны (у них много дел), поэтому вместо этого ...

Ваш фрагмент должен «запросить свои данные» для отображения списка и отправить изменения вместо (давайте назовем это хранилище), поэтому, как только пользователь нажимает «Alumno» из списка, список сообщает репо: «эй, этот Alumno выбран».

Хранилище получит эту информацию, отфильтрует результаты и опубликует их.

С другой стороны, фрагмент Other (интересующий выбранных Alumnos) будет прослушивать эти изменения и скажет , что отображать.

Думайтекак:

FragmentOther запускается и спрашивает репо: «дай мне данные для отображения» Репозиторий ответит: Вот список Alumnos.

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

Репо снова отфильтрует список вопросов и предложит его всем заинтересованным.

Если FragmentOther (вопросы) открыт, он получит его, если нет, то после открытия он запросит текущий список, а затем репо вернет его.

Итак, вы видите ключ во всем этом - печально известное разделение интересов .

Каждый класс / объект должен иметь наименьшее количество обязанностей и быть максимально пригодным для повторного использования.

ДляЧтобы достичь всего этого, используя современные практики Android, я рекомендую вам потратить время на изучение:

LiveData, Шаблон репозитория и LifeCycle, например.

Все это является частью Android Jetpack .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...