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();
}
}
}
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
Was haben Sie am Ende getan? –