5

私はRecyclerViewsである、私のアプリケーション内でlistViewsと呼ばれていた一連のものを持っています。私は、モジュール性を高め、アプリのこのセクションの繰り返しを減らす最も効率的な方法について興味があります。例えば、私はGroupMemberFragmentFriendFragment、同じRecyclerView.ViewHolders近く持っているとRecyclerView.AdaptersRecyclerViewオブジェクト、アダプター、ビューホルダーを再利用する方法

は、コードの重複を削減するようにリファクタリングする最良の方法は何まだ、まだ、それぞれの項目のリストはにユニークであることを可能

を持っています将来のデータを追加するのに十分な柔軟性を備えていますか?

GroupMemberFragment

public class GroupMemberFragment extends Fragment { 

    RecyclerView mRecyclerView; 
    ArrayList<Group> mGRoups; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.recycler_layout, container, false); 

     mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_layout); 
     mRecyclerView.setHasFixedSize(true); 

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

     // Only things that need to change across all the list classes.... 
     mGRoups = GroupListProvider.getInstance(getActivity()).getGroups(); 
     mRecyclerView.setAdapter(new GroupAdapter(mGRoups)); 

     return view; 
    } 


    // inner Class 

    private class GroupViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private final TextView mName; 
     private final TextView mChannel; 

     public GroupViewHolder(View itemView) { 
      super(itemView); 

      mName = (TextView) itemView.findViewById(R.id.tv_name); 
      mChannel = (TextView) itemView.findViewById(R.id.tv_number); 

      mName.setOnClickListener(this); 
     } 

     public void bindGroup(Group group){ 
      mName.setText(group.getName().toString()); 
      mChannel.setText(group.getGroupChannelID().toString()); 
     } 

     @Override 
     public void onClick(View view) { 
      int itemPosition = getAdapterPosition(); 
      Toast.makeText(getContext(), "Position is: " + String.valueOf(itemPosition), Toast.LENGTH_LONG).show(); 
     } 
    } 


    class GroupAdapter extends RecyclerView.Adapter<GroupViewHolder> { 
     ArrayList<Group> groupList; 

     GroupAdapter(ArrayList<Group> object){ 
      this.groupList = object; 
     } 

     @Override 
     public GroupViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.rv_item, parent, false); 

      return new GroupViewHolder(view); 

     } 

     @Override 
     public void onBindViewHolder(GroupViewHolder holder, int position) { 

      Group group = groupList.get(position); 
      holder.bindGroup(group); 
     } 

     @Override 
     public int getItemCount() { 
      return groupList.size(); 
     } 
    } 
} 

FriendFragment

public class FriendFragment extends Fragment { 

    RecyclerView mRecyclerView; 
    ArrayList<Friend> mContacts; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.recycler_layout, container, false); 

     mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_layout); 
     mRecyclerView.setHasFixedSize(true); 

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

     mContacts = FriendProvider.getInstance(getActivity()).getFriends(); 
     mRecyclerView.setAdapter(new ContactAdapter(mContacts)); 

     return view; 
    } 

    // Inner Class 

    private class ContactViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     private final TextView mName; 
     private final TextView mNumber; 
     private Friend mContact; 

     public ContactViewHolder(View itemView) { 
      super(itemView); 

      mName = (TextView) itemView.findViewById(R.id.tv_name); 
      mNumber = (TextView) itemView.findViewById(R.id.tv_number); 

      mName.setOnClickListener(this); 
     } 

     public void bindContact(Friend contact){ 
      mContact = contact; 
      mName.setText(contact.getFirstName().toString() + " " + contact.getLastName()); 
      mNumber.setText(contact.getFriendChannelID().toString()); 
     } 

     @Override 
     public void onClick(View view) { 
      int itemPosition = getAdapterPosition(); 
      Toast.makeText(getContext(), "Position is: " + String.valueOf(itemPosition), Toast.LENGTH_LONG).show(); 
     } 

    } 

    class ContactAdapter extends RecyclerView.Adapter<ContactViewHolder> { 
     ArrayList<Friend> contactList; 

     ContactAdapter(ArrayList<Friend> object){ 
      this.contactList = object; 
     } 

     @Override 
     public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.rv_item, parent, false); 

      return new ContactViewHolder(view); 

     } 

     @Override 
     public void onBindViewHolder(ContactViewHolder holder, int position) { 

      Friend contact = contactList.get(position); 
      holder.bindContact(contact); 
     } 


     @Override 
     public int getItemCount() { 
      return contactList.size(); 
     } 
    } 
} 
+0

こんにちは! 「将来的にデータを追加する」と言ってどういう意味ですか?あなたは何を変えようとしていますか?あなたのアダプターは共通点がほとんどないようです(両方のリストデータを除いて) – j2esu

+0

あなたは何をやったのですか? –

答えて

0

あなたはそれ少し滑らかな印象にするために、あなたのオブジェクトを作成するためのファクトリメソッドを作成することもできますが、あなたのコードイマイチがしっかりルックスだけでそれを結合あなたは同じことを2回やっているのですが、彼らは完全に別々のことをやっているので、それを残すか、きれいにしてくださいいくつかのオブジェクトファクトリまたはアプリクラス変数を使用して

+1

コードはどのような意味で「ぎこちない」ですか?どのようにそれをきれいにすることができますか? – Sauron

0

の両方のクラスからアダプタクラスを取り出して、別々のJavaファイルを作成して、両方のクラスに同じアダプタを使用することができます。 これを行うには、アダプタ用に2つの異なるコンストラクタを作成し、それを達成することができます。

+1

答えを示す例を入力してください – Sauron

関連する問題