Added Event List
This commit is contained in:
@@ -23,7 +23,7 @@ class ModDetailAdapter extends FragmentStatePagerAdapter {
|
||||
// Returns total number of pages
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 3;
|
||||
return 4;
|
||||
}
|
||||
|
||||
// Returns the fragment to display for that page
|
||||
@@ -36,6 +36,8 @@ class ModDetailAdapter extends FragmentStatePagerAdapter {
|
||||
return ModDetailAnnounceFragment.newInstance(mItemPos);
|
||||
case 2:
|
||||
return ModDetailAssignmentFragment.newInstance(mItemPos);
|
||||
case 3:
|
||||
return ModDetailEventFragment.newInstance(mItemPos);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
@@ -51,6 +53,8 @@ class ModDetailAdapter extends FragmentStatePagerAdapter {
|
||||
return this.mContext.getResources().getString(R.string.announcements);
|
||||
case 2:
|
||||
return this.mContext.getResources().getString(R.string.assignments);
|
||||
case 3:
|
||||
return this.mContext.getResources().getString(R.string.events);
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ public class ModDetailAnnounceFragment extends Fragment {
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
// Inflate the layout for this fragment
|
||||
View view = inflater.inflate(R.layout.fragment_mod_detail_announce, container, false);
|
||||
View view = inflater.inflate(R.layout.fragment_expandable_list_view, container, false);
|
||||
// Set the adapter
|
||||
Context context = view.getContext();
|
||||
ExpandableListView expandableListView = view.findViewById(R.id.list);
|
||||
|
||||
@@ -66,7 +66,7 @@ public class ModDetailAssignmentFragment extends Fragment {
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
// Inflate the layout for this fragment
|
||||
View view = inflater.inflate(R.layout.fragment_mod_detail_announce, container, false);
|
||||
View view = inflater.inflate(R.layout.fragment_expandable_list_view, container, false);
|
||||
// Set the adapter
|
||||
Context context = view.getContext();
|
||||
ExpandableListView expandableListView = view.findViewById(R.id.list);
|
||||
|
||||
@@ -0,0 +1,178 @@
|
||||
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;
|
||||
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.types.Announcement;
|
||||
import de.sebse.fuplanner.services.KVV.types.Assignment;
|
||||
import de.sebse.fuplanner.services.KVV.types.Event;
|
||||
import de.sebse.fuplanner.services.KVV.types.Modules;
|
||||
import de.sebse.fuplanner.tools.Conversion;
|
||||
import de.sebse.fuplanner.tools.logging.Logger;
|
||||
import de.sebse.fuplanner.tools.ui.CustomViewHolder;
|
||||
import de.sebse.fuplanner.tools.ui.ItemViewHolder;
|
||||
|
||||
public class ModDetailEventAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
private static final int TYPE_HEADER = 0;
|
||||
private static final int TYPE_ITEM = 1;
|
||||
|
||||
private static final int SECTION_UPCOMING = 0;
|
||||
private static final int SECTION_PAST = 1;
|
||||
|
||||
private Modules.Module mValue;
|
||||
private final ArrayList<Pair<Integer, Integer>> mPositionalData;
|
||||
private Logger log = new Logger(this);
|
||||
//private final ModulesFragment.OnModulesFragmentInteractionListener mListener;
|
||||
|
||||
public ModDetailEventAdapter(/*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();
|
||||
addPositionalListData(getUpcomingEventsCount(), SECTION_UPCOMING);
|
||||
mPositionalData.add(new Pair<>(TYPE_HEADER, SECTION_PAST));
|
||||
addPositionalListData(getPastEventsCount(), SECTION_PAST);
|
||||
|
||||
this.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void addPositionalListData(int count, int category) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
mPositionalData.add(new Pair<>(TYPE_ITEM, category+1024*i));
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view;
|
||||
switch (viewType) {
|
||||
case TYPE_HEADER:
|
||||
view = LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.list_all_caption, parent, false);
|
||||
return new HeaderViewHolder(view);
|
||||
case TYPE_ITEM:
|
||||
view = LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.list_all_items, parent, false);
|
||||
return new ItemViewHolder(view);
|
||||
default:
|
||||
//noinspection ConstantConditions
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
// Note that unlike in ListView adapters, types don't have to be contiguous
|
||||
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 || position > mPositionalData.size())
|
||||
return;
|
||||
Pair<Integer, Integer> data = mPositionalData.get(position);
|
||||
switch (data.first) {
|
||||
case TYPE_HEADER:
|
||||
HeaderViewHolder h = (HeaderViewHolder) holder;
|
||||
switch (data.second) {
|
||||
case SECTION_PAST:
|
||||
h.mCaption.setText(R.string.past_events);
|
||||
break;
|
||||
case SECTION_UPCOMING:
|
||||
h.mCaption.setText(R.string.upcoming_events);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TYPE_ITEM:
|
||||
int section = data.second % 1024;
|
||||
int index = data.second / 1024;
|
||||
ItemViewHolder i = (ItemViewHolder) holder;
|
||||
Event event = null;
|
||||
switch (section) {
|
||||
case SECTION_UPCOMING:
|
||||
event = mValue.events.getUpcoming(index);
|
||||
break;
|
||||
case SECTION_PAST:
|
||||
event = mValue.events.getPast(index);
|
||||
break;
|
||||
}
|
||||
//noinspection ConstantConditions
|
||||
i.mTitle.setText(event.getTitle());
|
||||
i.mSubLeft.setText(event.getType());
|
||||
String start, end;
|
||||
if (Conversion.dateEquals(event.getStartDate(), System.currentTimeMillis()))
|
||||
start = Conversion.getModifiedTime(i.mView.getContext(), event.getStartDate());
|
||||
else
|
||||
start = Conversion.getModifiedDateTime(i.mView.getContext(), event.getStartDate());
|
||||
if (Conversion.dateEquals(event.getStartDate(), event.getEndDate()))
|
||||
end = Conversion.getModifiedTime(i.mView.getContext(), event.getEndDate());
|
||||
else
|
||||
end = Conversion.getModifiedDateTime(i.mView.getContext(), event.getEndDate());
|
||||
i.mSubRight.setText(i.mView.getResources().getString(R.string.date_scale,
|
||||
start, end
|
||||
));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mPositionalData.size();
|
||||
}
|
||||
|
||||
private int getUpcomingEventsCount() {
|
||||
if (mValue.events != null)
|
||||
return mValue.events.sizeUpcoming();
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int getPastEventsCount() {
|
||||
if (mValue.events != null)
|
||||
return mValue.events.sizePast();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public class HeaderViewHolder extends CustomViewHolder {
|
||||
final TextView mCaption;
|
||||
|
||||
HeaderViewHolder(View view) {
|
||||
super(view);
|
||||
mCaption = view.findViewById(R.id.caption);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mCaption.getText() + "'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package de.sebse.fuplanner.fragments.moddetails;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.widget.SwipeRefreshLayout;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import de.sebse.fuplanner.MainActivity;
|
||||
import de.sebse.fuplanner.R;
|
||||
import de.sebse.fuplanner.services.KVV.KVV;
|
||||
import de.sebse.fuplanner.services.KVV.types.Modules;
|
||||
import de.sebse.fuplanner.tools.logging.Logger;
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
* Use the {@link ModDetailEventFragment#newInstance} factory method to
|
||||
* create an instance of this fragment.
|
||||
*/
|
||||
public class ModDetailEventFragment extends Fragment {
|
||||
// TODO: Rename parameter arguments, choose names that match
|
||||
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
|
||||
private static final String ARG_POSITION = "itemPosition";
|
||||
|
||||
// TODO: Rename and change types of parameters
|
||||
private int mItemPos;
|
||||
private Logger log = new Logger(this);
|
||||
private ModDetailEventAdapter adapter;
|
||||
private SwipeRefreshLayout swipeLayout;
|
||||
|
||||
|
||||
public ModDetailEventFragment() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this factory method to create a new instance of
|
||||
* this fragment using the provided parameters.
|
||||
*
|
||||
* @param itemPosition Item position in module list.
|
||||
* @return A new instance of fragment ModDetailAnnounceFragment.
|
||||
*/
|
||||
// TODO: Rename and change types and number of parameters
|
||||
public static ModDetailEventFragment newInstance(int itemPosition) {
|
||||
ModDetailEventFragment fragment = new ModDetailEventFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putInt(ARG_POSITION, itemPosition);
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (getArguments() != null) {
|
||||
mItemPos = getArguments().getInt(ARG_POSITION);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
// Inflate the layout for this fragment
|
||||
View view = inflater.inflate(R.layout.fragment_recycler_view, container, false);
|
||||
// Set the adapter
|
||||
Context context = view.getContext();
|
||||
RecyclerView recyclerView = view.findViewById(R.id.list);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||
adapter = new ModDetailEventAdapter();
|
||||
recyclerView.setAdapter(adapter);
|
||||
|
||||
// Getting SwipeContainerLayout
|
||||
swipeLayout = view.findViewById(R.id.swipe_container);
|
||||
// Adding Listener
|
||||
swipeLayout.setOnRefreshListener(() -> refresh(true));
|
||||
refresh(false);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
private void refresh(boolean forceRefresh) {
|
||||
if (getActivity() != null) {
|
||||
KVV kvv = ((MainActivity) getActivity()).getKVV();
|
||||
kvv.getModuleList((Modules success) -> {
|
||||
Modules.Module module = success.get(mItemPos);
|
||||
adapter.setModule(module);
|
||||
kvv.getModuleEvents(module, success1 -> {
|
||||
adapter.setModule();
|
||||
swipeLayout.setRefreshing(false);
|
||||
}, error -> {
|
||||
swipeLayout.setRefreshing(false);
|
||||
log.e(error);
|
||||
});
|
||||
}, error -> {
|
||||
swipeLayout.setRefreshing(false);
|
||||
log.e(error);
|
||||
}, forceRefresh);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -67,7 +67,7 @@ public class ModDetailOverviewFragment extends Fragment {
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
// Inflate the layout for this fragment
|
||||
View view = inflater.inflate(R.layout.fragment_mod_detail_overview, container, false);
|
||||
View view = inflater.inflate(R.layout.fragment_recycler_view, container, false);
|
||||
// Set the adapter
|
||||
Context context = view.getContext();
|
||||
RecyclerView recyclerView = view.findViewById(R.id.list);
|
||||
|
||||
@@ -9,16 +9,18 @@ public class ItemViewHolder extends CustomViewHolder {
|
||||
public final TextView mTitle;
|
||||
public final TextView mSubLeft;
|
||||
public final TextView mSubRight;
|
||||
public final TextView mTopRight;
|
||||
|
||||
public ItemViewHolder(View view) {
|
||||
super(view);
|
||||
mTitle = view.findViewById(R.id.title);
|
||||
mSubLeft = view.findViewById(R.id.sub_left);
|
||||
mSubRight = view.findViewById(R.id.sub_right);
|
||||
mTopRight = view.findViewById(R.id.top_right);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mTitle.getText() + "' '" + mSubLeft.getText() + "' '" + mSubRight.getText() + "'";
|
||||
return super.toString() + " '" + mTitle.getText() + "' '" + mSubLeft.getText() + "' '" + mSubRight.getText() + "' '" + mTopRight.getText() + "'";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,4 +35,17 @@
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
tools:text="20.03.18 18:42 Uhr" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/top_right"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignBaseline="@id/title"
|
||||
android:layout_alignBottom="@id/title"
|
||||
android:textColor="#343434"
|
||||
android:textSize="12sp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
tools:text="Raum 105"
|
||||
tools:ignore="RelativeOverlap" />
|
||||
</RelativeLayout>
|
||||
@@ -34,4 +34,6 @@
|
||||
<string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
|
||||
<string name="enter_offline_mode">Enter Offline Mode (%1$s)</string>
|
||||
<string name="no_items_available">No items available!</string>
|
||||
<string name="past_events">Past Events</string>
|
||||
<string name="events">Events</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user