5

Ich habe eine Reihe von, was früher ListViews genannt wurde, innerhalb meiner App, die jetzt RecyclerViews sind. Ich bin neugierig auf die effizienteste Möglichkeit, die Modularität zu erhöhen und die Wiederholung dieses Abschnitts meiner App zu reduzieren.Wie RecyclerView Objekte, Adapter und Ansichtshalter wiederverwenden

Zum Beispiel habe ich die GroupMemberFragment und FriendFragment, die nahezu identische RecyclerView.ViewHolders haben und RecyclerView.Adapters

Was die bestmögliche Art und Weise ist so zu Refactoring als Code-Duplizierung zu reduzieren noch immer noch erlauben, jeder entsprechende Artikelliste eindeutig sein zu seine Daten und flexibel genug, um in Zukunft weitere Daten hinzuzufügen?

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

Hallo! Was meinst du damit, "zukünftig mehr Daten hinzufügen"? Welche Veränderungen werden Sie vornehmen? Jetzt scheint es, dass Ihre Adapter sehr wenig gemeinsam haben (außer beide haben Listendaten) – j2esu

+0

Was haben Sie am Ende getan? –

Antwort

0

Sie Factory-Methoden für Ihre Objekterstellung schaffen könnte es ein wenig übersichtlicher zu machen, aber der Code ist nicht eng gekoppelt es sieht einfach schlampig becayse du machst das gleiche schon zweimal, aber sie machen total getrennte sachen, also lass es entweder oder rein mit einigen Objektfabriken oder App Klassenvariablen

+1

In welcher Weise ist der Code "schlampig"? Wie kann es aufgeräumt werden? – Sauron

0

können Sie die Adapterklasse aus beiden Klassen herausnehmen und eine separate Java-Datei für sie erstellen und den gleichen Adapter für beide Klassen verwenden. Um dies zu tun, können Sie zwei verschiedene Konstruktoren für den Adapter erstellen und erreichen.

+1

Bitte geben Sie ein Beispiel mit Ihrer Antwort an – Sauron

Verwandte Themen