2015-12-19 40 views
0

我正在爲我的android考試做一個Reddit應用程序,我對繼承有一個疑問。圍繞繼承自定義片段的最佳做法是什麼

我有一個片段誰有一個RecyclerView。 recyclerview包含一個redditposts列表。我的應用程序包含多個subreddits(有趣,遊戲,新聞等)。每個subreddit都有自己的片段。我有一些每個片段都必須具備的方法。 (一個showProgressBar,hideProgressBar,populateResult等)我認爲這將是簡單的,如果我只是做一個片段類的所有subreddit碎片可以繼承。我可以將所有方法放入該片段類中,因爲每個子片段片段的方法都是相同的。但是我的講師說這是對繼承的不好用。那麼有沒有人有圍繞這個問題的最佳做法?

這是我正在談論的片段: package 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()。

回答

0

有編程一個長期的口頭禪,指出:「有利於對繼承組成」

你可以閱讀本聲明的細節和大量的討論here

在這種情況下,繼承是不必要的,因爲您可以簡單地構建1 Fragment,並在初始化時將其傳遞給subreddit,從而避免超級和子類之間可能甚至沒有任何多態關係的約束鏈接。

+0

我知道,在我的情況下,我可以構建1片段,但我想要一個答案,我可以在未來使用我的下一個版本,並且您提供了我,謝謝! –

+0

我很高興能幫上忙。你介意接受我的回答嗎? – freddig

相關問題