Fixed ModDetailsOverviewAdapter with Assignments

This commit is contained in:
Caesar2011
2018-06-07 10:09:52 +02:00
parent ded53f2f79
commit d7048ed869
2 changed files with 83 additions and 59 deletions

View File

@@ -2,6 +2,7 @@ package de.sebse.fuplanner.fragments.moddetails;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -9,32 +10,63 @@ import android.widget.TextView;
import com.ms.square.android.expandabletextview.ExpandableTextView;
import java.util.ArrayList;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.Announcement;
import de.sebse.fuplanner.services.KVV.Assignment;
import de.sebse.fuplanner.services.KVV.Modules;
import de.sebse.fuplanner.tools.Conversion;
import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.CustomViewHolder;
public class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int MAX_ITEMS_PER_PREVIEW = 2;
private static final int TYPE_HEADER = 0;
private static final int TYPE_DESCRIPTION = 1;
private static final int TYPE_ITEM = 2;
private static final int TYPE_SHOW_MORE = 3;
private static final int SECTION_DESCRIPTION = 0;
private static final int SECTION_ANNOUNCEMENT = 1;
private static final int SECTION_ASSIGNMENT = 2;
private Modules.Module mValue;
private final ArrayList<Pair<Integer, Object>> mPositionalData;
private Logger log = new Logger(this);
//private final ModulesFragment.OnModulesFragmentInteractionListener mListener;
public ModDetailOverviewAdapter(/*ModulesFragment.OnModulesFragmentInteractionListener listener*/) {
mValue = null;
mPositionalData = new ArrayList<>();
//mListener = listener;
}
public void setModule(Modules.Module module) {
mValue = module;
this.setModule();
}
public void setModule() {
mPositionalData.clear();
mPositionalData.add(new Pair<>(TYPE_HEADER, SECTION_DESCRIPTION));
mPositionalData.add(new Pair<>(TYPE_DESCRIPTION, null));
mPositionalData.add(new Pair<>(TYPE_HEADER, SECTION_ANNOUNCEMENT));
addPositionalListData(getAnnounceCount(), SECTION_ANNOUNCEMENT);
mPositionalData.add(new Pair<>(TYPE_HEADER, SECTION_ASSIGNMENT));
addPositionalListData(getAssignmentCount(), SECTION_ASSIGNMENT);
this.notifyDataSetChanged();
}
private void addPositionalListData(int count, int category) {
for (int i = 0; i < Math.min(MAX_ITEMS_PER_PREVIEW, count); i++) {
mPositionalData.add(new Pair<>(TYPE_ITEM, category+1024*i));
}
if (count > MAX_ITEMS_PER_PREVIEW)
mPositionalData.add(new Pair<>(TYPE_SHOW_MORE, category));
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -64,66 +96,64 @@ public class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.
@Override
public int getItemViewType(int position) {
// Just as an example, return 0 or 2 depending on position
// Note that unlike in ListView adapters, types don't have to be contiguous
if (position < 3)
return position % 2; // HEADER, DESCRIPTION, HEADER
int count = 2;
// Announcements
if (position <= count+getAnnounceCount(2))
return TYPE_ITEM;
count += getAnnounceCount(3);
if (position <= count)
return TYPE_SHOW_MORE;
// Assignments
count++;
if (position <= count)
return TYPE_HEADER;
count++;
if (position <= count+getAssignmentCount(2))
return TYPE_ITEM;
count += getAssignmentCount(3);
if (position <= count)
return TYPE_SHOW_MORE;
return 0;
if (position < mPositionalData.size())
return mPositionalData.get(position).first;
else return -1;
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
if (mValue == null)
if (mValue == null || position > mPositionalData.size())
return;
if (position == 0) {
Pair<Integer, Object> data = mPositionalData.get(position);
switch (data.first) {
case TYPE_HEADER:
HeaderViewHolder h = (HeaderViewHolder) holder;
switch ((Integer) data.second) {
case SECTION_DESCRIPTION:
h.mCaption.setText(R.string.description);
} else if (position == 1) {
break;
case SECTION_ANNOUNCEMENT:
h.mCaption.setText(h.mView.getResources().getString(R.string.announcements_count, getAnnounceCount()));
break;
case SECTION_ASSIGNMENT:
h.mCaption.setText(h.mView.getResources().getString(R.string.assignments_count, getAssignmentCount()));
break;
}
break;
case TYPE_DESCRIPTION:
DescriptionViewHolder d = (DescriptionViewHolder) holder;
d.mText.setText(mValue.description);
} else if (position == 2) {
HeaderViewHolder h = (HeaderViewHolder) holder;
h.mCaption.setText(h.mView.getResources().getString(R.string.announcements_count, getAnnounceCount()));
} else if (position <= getAnnounceCount(2)+2) {
ItemViewHolder a = (ItemViewHolder) holder;
Announcement announce = mValue.announcements.get(position - 3);
a.mTitle.setText(announce.getTitle());
a.mSubLeft.setText(announce.getCreatedBy());
a.mSubRight.setText(Conversion.getModifiedDate(announce.getCreatedOn()));
} else if (position <= getAnnounceCount(3)+getAssignmentCount(2)+3) {
ItemViewHolder a = (ItemViewHolder) holder;
Assignment assignment = mValue.assignments.get(position - 3);
a.mTitle.setText(assignment.getTitle());
a.mSubLeft.setText(assignment.getStatus());
a.mSubRight.setText(Conversion.getModifiedDate(assignment.getDueDate()));
break;
case TYPE_ITEM:
int section = ((Integer) data.second) % 1024;
int index = ((Integer) data.second) / 1024;
ItemViewHolder i = (ItemViewHolder) holder;
switch (section) {
case SECTION_ANNOUNCEMENT:
Announcement announce = mValue.announcements.get(index);
i.mTitle.setText(announce.getTitle());
i.mSubLeft.setText(announce.getCreatedBy());
i.mSubRight.setText(Conversion.getModifiedDate(announce.getCreatedOn()));
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_ANNOUNCEMENT, index));
break;
case SECTION_ASSIGNMENT:
Assignment assignment = mValue.assignments.get(index);
i.mTitle.setText(assignment.getTitle());
i.mSubLeft.setText(assignment.getStatus());
i.mSubRight.setText(Conversion.getModifiedDate(assignment.getDueDate()));
i.mView.setOnClickListener(view -> log.d("Refeerence to:", SECTION_ASSIGNMENT, index));
}
case TYPE_SHOW_MORE:
CustomViewHolder c = (CustomViewHolder) holder;
c.mView.setOnClickListener(view -> log.d("Refeerence to:", data.second, -1));
}
}
@Override
public int getItemCount() {
if (mValue != null) {
return 4+getAnnounceCount(3)+getAssignmentCount(3);
}
return 0;
return mPositionalData.size();
}
private int getAnnounceCount() {
@@ -132,20 +162,12 @@ public class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.
return 0;
}
private int getAnnounceCount(int max) {
return Math.min(max, getAnnounceCount());
}
private int getAssignmentCount() {
if (mValue.assignments != null)
return mValue.assignments.size();
return 0;
}
private int getAssignmentCount(int max) {
return Math.min(max, getAssignmentCount());
}

View File

@@ -1,5 +1,5 @@
<resources>
<string name="app_name">FU Planner</string>
<string name="app_name" translatable="false">FU Planner</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
@@ -9,7 +9,7 @@
<!-- TODO: Remove or change this placeholder text -->
<string name="overview">Overview</string>
<string name="announcements">Announcements</string>
<string name="lorem_ipsum_100">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</string>
<string name="lorem_ipsum_100" translatable="false">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</string>
<string name="description">Description</string>
<string name="announcements_count">Announcements (%1$d)</string>
<string name="cd_ic_launcher">App Icon</string>
@@ -24,4 +24,6 @@
<string name="username">Username</string>
<string name="password">Password</string>
<string name="show_all">Show All</string>
<string name="assignments_count">Assignments (%1$d)</string>
<string name="assignments">Assignments</string>
</resources>