Получить проверенные элементы от Recyclerview до родительского фрагмента из дочернего фрагмента с вкладками - PullRequest
0 голосов
/ 01 марта 2019

У меня есть фрагмент диалога с этими виджетами пользовательского интерфейса - макет вкладок с двумя вкладками и viewpager и кнопка для отправки результатов в нижней части.Каждая из вкладок содержит флажок recyclerview-*. 1001 *

Когда элементы выбраны и нажата кнопка, я хочу получить идентификаторы каждого элемента на основе отмеченной позиции.

Вот моя реализация дляодин фрагмент / вкладка, я заполнил список, и он хорошо работает, например:

public class MySessionsFragment extends Fragment {

private static final String TAG = MySessionsFragment.class.getSimpleName();
private RecyclerView mySessionsRV;
private MySessionsAdapter adapter;
private List<Sessions> list = new ArrayList<>();

public MySessionsFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_my_sessions, container, false);
    init(view);
    return view;
}

private void init(View view) {
    mySessionsRV = view.findViewById(R.id.mySessionsRV);

    mySessionsRV.setHasFixedSize(true);
    mySessionsRV.setLayoutManager(new GridLayoutManager(getActivity(), 3));

    populate();
}

private void populate() {
    SQLite.select()
            .from(Sessions.class)
            .async()
            .queryListResultCallback(new QueryTransaction.QueryResultListCallback<Sessions>() {
                @Override
                public void onListQueryResult(QueryTransaction transaction, @NonNull List<Sessions> tResult) {
                    list = tResult;
                    adapter = new MySessionsAdapter(getActivity(), list);
                    mySessionsRV.setAdapter(adapter);
                }
            }).execute();
     }
 }

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

public class ProgramsSessionsListFragment extends DialogFragment {

private static final String TAG = ProgramsSessionsListFragment.class.getSimpleName();

private Toolbar toolbar;
private ImageView closeIV;
private TabLayout tabLayout;
private FloatingActionButton addSessionFAB;
private ViewPager viewPager;
private ViewPagerAdapter pagerAdapter;
private Button doneBtn;

private List<String> myItemsList = new ArrayList<>();

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_sessions_list, container, false);
    init(view);
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
    return view;
}

private void init(View view) {
    toolbar = view.findViewById(R.id.toolbar);
    closeIV = view.findViewById(R.id.closeIV);
    tabLayout = view.findViewById(R.id.tabLayout);
    addSessionFAB = view.findViewById(R.id.addSessionFAB);
    viewPager = view.findViewById(R.id.viewPager);
    doneBtn = view.findViewById(R.id.doneBtn);

    closeIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dismiss();
        }
    });

    addSessionFAB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NewSessionDialog sessionDialog = new NewSessionDialog();
            sessionDialog.setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Light_NoTitleBar_Fullscreen);
            sessionDialog.show(getChildFragmentManager(), "NewSessionDialog");
        }
    });

    doneBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            retrieveSessionsSelected();
        }
    });

    setUpTabs();
}

private void retrieveSessionsSelected() {
    MySessionsAdapter adapter = new MySessionsAdapter(getActivity());
    adapter.getItemsSelected();

    if (adapter.getItemsSelected().size() > 0) {
        Log.d(TAG, "My Sessions List Size:\t" + myItemsList.size());
        myItemsList = adapter.getItemsSelected();
        //get individual items from list
        for (int i = 0; i < myItemsList.size(); i++) {
            Log.d(TAG, "Selected Items Id:\t" + myItemsList.get(i));
        }
    } else {
        Toast.makeText(getActivity(), "Ntn Selected Yet", Toast.LENGTH_SHORT).show();
    }

}

private void setUpTabs() {
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    tabLayout.setupWithViewPager(viewPager);
    setUpViewPager(viewPager);
}

private void setUpViewPager(ViewPager viewPager) {

    MySessionsFragment mf = new MySessionsFragment();
    RecommFragment rf = new RecommFragment();

    pagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
    pagerAdapter.addFragTab(mf, "My Sessions");
    pagerAdapter.addFragTab(rf, "Recommended");
    viewPager.setAdapter(pagerAdapter);
   }

}

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

public class MySessionsAdapter extends RecyclerView.Adapter<MySessionsViewHolder> {

private static final String TAG = MySessionsAdapter.class.getSimpleName();

private final Context context;
private List<Sessions> itemsList;
private List<String> selectedSessionsList = new ArrayList<>();

public MySessionsAdapter(Context context) {
    this.context = context;
}

public MySessionsAdapter(Context context, List<Sessions> itemsList) {
    this.context = context;
    this.itemsList = itemsList;
}

@Override
public MySessionsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_sessions_items_layout, parent, false);
    return new MySessionsViewHolder(view);
}

@Override
public void onBindViewHolder(MySessionsViewHolder viewholder, int position) {
    final Sessions sessions = itemsList.get(position);
    viewholder.mySessionNameTV.setText(sessions.session_name);
    Picasso.with(context)
            .load(sessions.session_cover_image)
            .placeholder(R.drawable.app_logo_resized)
            .into(viewholder.mySessionIV);
    viewholder.checkBoxSelect.setChecked(false);
    viewholder.checkBoxSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                Log.d(TAG, "Session id:\t" + sessions.prog_sessionId);
                selectedSessionsList.add(sessions.prog_sessionId);
                for (int m = 0; m < selectedSessionsList.size(); m++) {
                    Log.d(TAG, "Session id in list:\t" + selectedSessionsList.get(m));
                }
            }
        }
    });
}

public List<String> getItemsSelected() {
    return selectedSessionsList;
}

@Override
public int getItemCount() {
    if (itemsList == null) {
        return 0;
    }
    return itemsList.size();
}
}

Когда я запускаю это приложение, я получаю сообщение о тосте, котороеничего не выбрано, но на вкладке я вижу журнал каждого выбранного элемента, но вызов метода адаптера в родительском фрагменте не возвращает никаких значений.Может кто-нибудь объяснить мне, что я здесь не так сделал?Спасибо.

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