Как я могу использовать код моего фрагмента? - PullRequest
0 голосов
/ 26 апреля 2018

Я пишу приложение для Android с ViewPager.Мой ViewPager содержит два фрагмента.В каждом фрагменте расположены два receclerView для отображения различных списков элементов LiveData из базы данных (я использую Room)

Код для BaseFragment

public class BaseFragment extends Fragment {

private RecyclerView recyclerView;
private NewsAdapter adapter;
public ViewModel mViewModel;

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


@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mViewModel = ViewModelProviders.of(this).get(ViewModel.class);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View mView = inflater.inflate(R.layout.fragment_feeds, container, false);
    recyclerView = mView.findViewById(R.id.feeds_recycler_view);
    return mView;
}

@Override
public void onActivityCreated(@Nullable final Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setUpRecyclerView();
    mViewModel.getAllNewsEntities()
            .observe(this, allNewsEntities -> {
                NewsEntityUtilCallback productDiffUtilCallback =
                        new NewsEntityUtilCallback(adapter.getNewsItems(), allNewsEntities);
                DiffUtil.DiffResult newsEntitiesDiffResult = DiffUtil.calculateDiff(productDiffUtilCallback);
                adapter.setNewsItems(allNewsEntities);
                newsEntitiesDiffResult.dispatchUpdatesTo(adapter);
            });
}

protected void setUpRecyclerView() {
    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(layoutManager);
    ItemClickListener onClickListener = (v, position) -> {
        String url = adapter.getNewsItems().get(position).getLink();
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        if (browserIntent.resolveActivity(getContext().getPackageManager()) != null) {
            startActivity(browserIntent);
        }
    };
    adapter = new NewsAdapter(getContext(), onClickListener);
    recyclerView.setAdapter(adapter);
}
}

Присмотритесьв этом разделе кода:

mViewModel.getAllNewsEntities()
            .observe(this, allNewsEntities -> {
                NewsEntityUtilCallback productDiffUtilCallback =
                        new NewsEntityUtilCallback(adapter.getNewsItems(), allNewsEntities);
                DiffUtil.DiffResult newsEntitiesDiffResult = DiffUtil.calculateDiff(productDiffUtilCallback);
                adapter.setNewsItems(allNewsEntities);
                newsEntitiesDiffResult.dispatchUpdatesTo(adapter);
            });
}

Здесь я собираюсь наблюдать различные запросы LiveData в каждом фрагменте (во втором фрагменте это mViewModel.getAllBookmarkedNewsEntities ()). Другими словами, мой код будет равен (те же методы жизненных циклов, тот же RecyclerView). Так что можете дать мне совет о наилучшем из возможных принципов проектирования для рефакторинга моего кода. Я не хочу просто копировать мой код в другой класс Fragment только из-за одной строки

1 Ответ

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

Просто расширяет BaseFragment и переопределяет метод onActivityCreated.Как то так:

public class ReuseBaseFragment extends BaseFragment {
    @Override
   public void onActivityCreated(@Nullable final Bundle savedInstanceState) {
      //Your new code here
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...