【问题标题】:What is the best practice around inheriting a custom fragment继承自定义片段的最佳实践是什么
【发布时间】:2015-12-19 20:48:03
【问题描述】:

我正在为我的 android 考试制作 Reddit 应用,但我有一个关于继承的问题。

我有一个拥有 RecyclerView 的 Fragment。该 recyclerview 包含一个 redditposts 列表。我的应用程序包含多个 subreddits(有趣、游戏、新闻等)。每个 subreddit 都有自己的 Fragment。我有一些每个 Fragment 都必须有的方法。 (一个 showProgressBar、hideProgressBar、populateResult 等......)我认为如果我只是创建一个 Fragment 类,所有 subreddit Fragments 都可以从中继承。我可以将所有方法放在该片段类中,因为每个 subreddit 片段的方法都是相同的。但是我的讲师说这是对继承的不好使用。那么有人有解决这个问题的最佳实践吗?

这是我正在谈论的片段: 包 com.example.thomas.redditapp;

public class FunnyFragment extends Fragment {

    private OnListFragmentInteractionListener mListener;

    @Bind(R.id.funny_recyclerview)
    RecyclerView mRecyclerView;

    @Bind(R.id.progressBarFetch)
    ProgressBar progress;

    private RedditHelper helper;

    private RedditPostRecyclerViewAdapter mAdapter;

    List<RedditPost> redditPosts;

    public FunnyFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        helper = null;
        helper = new RedditHelper(SubRedditEnum.funny, this);
        redditPosts = new ArrayList<>();
        startLoad();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_funny_list, container, false);
        ButterKnife.bind(this, view);
        showProgressBar();

        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        mAdapter = new RedditPostRecyclerViewAdapter(redditPosts, mListener, mRecyclerView);

        mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                redditPosts.add(null);
                helper.loadListFromUrl();
            }
        });

        mRecyclerView.setAdapter(mAdapter);



        return view;
    }

    protected void startLoad() {
        if (helper != null) {
            helper.loadListFromDb();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        if (isTaskRunning()) {
            showProgressBar();
        } else {
            hideProgressBar();
        }
        super.onActivityCreated(savedInstanceState);

    }

    public void hideProgressBar() {
        progress.setVisibility(View.GONE);

    }

    public void showProgressBar() {
        progress.setVisibility(View.VISIBLE);
        progress.setIndeterminate(true);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnListFragmentInteractionListener) {
            mListener = (OnListFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnListFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public void populateResult(List<RedditPost> result) {
        if(!redditPosts.isEmpty()){
            redditPosts.remove(redditPosts.size() - 1);
        }
        redditPosts.addAll(result);
        mAdapter.setLoaded();
        mAdapter.notifyDataSetChanged();
    }

    protected boolean isTaskRunning() {
        if (helper == null) {
            return false;
        } else if (helper.getStatus() == 0) {
            return false;
        } else {
            return true;
        }
    }
}

我在助手类中调用了 hideProgressBar()、showProgressBar() 和 populateResult()。

【问题讨论】:

    标签: android inheritance android-fragments


    【解决方案1】:

    编程中有一个长期存在的口头禅:“优先组合胜过继承”

    您可以阅读有关此声明的详细信息以及here的大量讨论。

    在这种情况下,继承是不必要的,因为您可以简单地构建 1 个 Fragment,并在初始化时将其传递给 subreddit,从而避免了父类和子类之间的任何约束链接,甚至可能没有任何类型的多态关系。

    【讨论】:

    • 我知道在我的情况下我只能构建 1 个片段,但我想要一个可以在未来用于我的下一个构建的答案,您提供给我了,谢谢!
    • 很高兴能帮上忙。你介意接受我的回答吗?
    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多