Наследование фрагментов - PullRequest
0 голосов
/ 02 июня 2018

У меня есть 3 абсолютно одинаковых фрагмента, только разница строковой переменной в каждом, даже если у них один и тот же файл макета и один и тот же метод onCreateView, я создал суперкласс со всеми открытыми методами, но все еще переменная дочернего класса не используетсяперешел в свой супер класс.Это дает нулевую ошибку ссылки на объект.

public class QuizFragment extends Fragment {

    private String posType = "xyz";




    @Nullable
    @Override
    public View onCreateView( @NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState ) {
        View view = inflater.inflate(R.layout.fragment_adapter, container, false);



        initContentView("createdDate");

        postCounterWatcher = new PostManager.PostCounterWatcher() {
            @Override
            public void onPostCounterChanged( int newValue ) {
                updateNewPostCounter();
            }
        };


        return view;

    }


    private void initContentView( String sortBy ) {

        newPostsCounterTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick( View v ) {
                refreshPostList(posType);
            }
        });

        postsAdapter = new PostsAdapter((MainActivity) getActivity(), swipeContainer, posType, sortBy);
        postsAdapter.setCallback(new PostsAdapter.Callback() {
            @Override
            public void onItemClick( final Post post, final View view ) {
                PostManager.getInstance(getActivity()).isPostExistSingleValue(post.getId(), new OnObjectExistListener<Post>() {
                    @Override
                    public void onDataChanged( boolean exist ) {
                        if (exist) {
                            openPostDetailsActivity(post, view);
                        } else {
                            showFloatButtonRelatedSnackBar(R.string.error_post_was_removed);
                        }
                    }
                }, posType);
            }

            @Override
            public void onListLoadingFinished() {
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onAuthorClick( String authorId, View view ) {
                openProfileActivity(authorId, view);
            }

            @Override
            public void onCanceled( String message ) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
            }
        });

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
        recyclerView.setAdapter(postsAdapter);
        postsAdapter.loadFirstPage(posType);
        updateNewPostCounter();

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled( RecyclerView recyclerView, int dx, int dy ) {
                hideCounterView();
                super.onScrolled(recyclerView, dx, dy);
            }
        });
    }


}

Здесь просто posType является переменной, которая варьируется в других фрагментах.

1 Ответ

0 голосов
/ 02 июня 2018

Сделайте его абстрактным и внедрите абстрактный метод для каждого фрагмента, чтобы он возвращал разные значения, как это сделано ниже:

public abstract class QuizFragment extends Fragment {

public abstract String posType();

@Nullable
@Override
public View onCreateView( @NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState ) {
    View view = inflater.inflate(R.layout.fragment_adapter, container, false);

    initContentView("createdDate");
    postCounterWatcher = new PostManager.PostCounterWatcher() {
        @Override
        public void onPostCounterChanged( int newValue ) {
            updateNewPostCounter();
        }
    };
    return view;
}

private void initContentView( String sortBy ) {

    newPostsCounterTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick( View v ) {
            refreshPostList(posType);
        }
    });

    postsAdapter = new PostsAdapter((MainActivity) getActivity(), swipeContainer, posType, sortBy);
    postsAdapter.setCallback(new PostsAdapter.Callback() {
        @Override
        public void onItemClick( final Post post, final View view ) {
            PostManager.getInstance(getActivity()).isPostExistSingleValue(post.getId(), new OnObjectExistListener<Post>() {
                @Override
                public void onDataChanged( boolean exist ) {
                    if (exist) {
                        openPostDetailsActivity(post, view);
                    } else {
                        showFloatButtonRelatedSnackBar(R.string.error_post_was_removed);
                    }
                }
            }, posType);
        }

        @Override
        public void onListLoadingFinished() {
            progressBar.setVisibility(View.GONE);
        }

        @Override
        public void onAuthorClick( String authorId, View view ) {
            openProfileActivity(authorId, view);
        }

        @Override
        public void onCanceled( String message ) {
            progressBar.setVisibility(View.GONE);
            Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
        }
    });

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
    recyclerView.setAdapter(postsAdapter);
    postsAdapter.loadFirstPage(posType);
    updateNewPostCounter();

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled( RecyclerView recyclerView, int dx, int dy ) {
            hideCounterView();
            super.onScrolled(recyclerView, dx, dy);
        }
    });
}

}

И некоторая реализация вашего абстрактного фрагмента:

public class QuizFragmentImpl extends QuizFragment {
    public String posType() {
        return "xyz";
    }
}
...