diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java b/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java index fe68b1cd..3ff9a0da 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java @@ -25,24 +25,12 @@ import org.floens.chan.core.watch.PinWatcher; @DatabaseTable public class Pin { - // Database stuff @DatabaseField(generatedId = true) public int id; @DatabaseField(canBeNull = false, foreign = true) public Loadable loadable = new Loadable("", -1); - // ListView Stuff - /** - * Header is used to display a static header in the drawer listview. - */ - public Type type = Type.THREAD; - - public static enum Type { - HEADER, THREAD - } - - // PinnedService stuff public PinWatcher pinWatcher; @DatabaseField diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java index 534ca450..2fcc434b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java @@ -147,7 +147,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene pinDrawerView = (ListView) findViewById(R.id.left_drawer); - pinnedAdapter = new PinnedAdapter(getActionBar().getThemedContext(), 0); // Get the dark theme, not the light one + pinnedAdapter = new PinnedAdapter(getActionBar().getThemedContext()); // Get the dark theme, not the light one pinnedAdapter.reload(); pinDrawerView.setAdapter(pinnedAdapter); @@ -155,7 +155,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Pin pin = pinnedAdapter.getItem(position); - if (pin == null || pin.type == Pin.Type.HEADER) + if (pin == null) return; openPin(pin); } @@ -165,7 +165,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { Pin post = pinnedAdapter.getItem(position); - if (post == null || post.type == Pin.Type.HEADER) + if (post == null) return false; changePinTitle(post); @@ -185,7 +185,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene @Override public boolean canDismiss(int position) { - return pinnedAdapter.getItem(position).type != Pin.Type.HEADER; + return pinnedAdapter.getItem(position) != null; } } ); @@ -199,7 +199,6 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene @Override public void onPinsChanged() { pinnedAdapter.reload(); - pinDrawerView.invalidate(); updateIcon(); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java index 16859abe..ba2f30d2 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java @@ -21,7 +21,7 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; @@ -32,120 +32,139 @@ import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.model.Pin; import java.util.ArrayList; -import java.util.HashMap; +import java.util.List; -public class PinnedAdapter extends ArrayAdapter { - private final HashMap idMap; - private int idCounter; +public class PinnedAdapter extends BaseAdapter { + private final static int VIEW_TYPE_ITEM = 0; + private final static int VIEW_TYPE_HEADER = 1; - public PinnedAdapter(Context context, int resId) { - super(context, resId, new ArrayList()); + private Context context; + private List pins = new ArrayList<>(); - idMap = new HashMap<>(); + public PinnedAdapter(Context context) { + this.context = context; } @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - - LinearLayout view; - - final Pin item = getItem(position); - - if (item.type == Pin.Type.HEADER) { - view = (LinearLayout) inflater.inflate(R.layout.pin_item_header, null); - - ((TextView) view.findViewById(R.id.drawer_item_header)).setText(R.string.drawer_pinned); - } else { - view = (LinearLayout) inflater.inflate(R.layout.pin_item, null); - - ((TextView) view.findViewById(R.id.drawer_item_text)).setText(item.loadable.title); + public int getCount() { + return pins.size() + 1; + } - FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.drawer_item_count_container); - if (ChanPreferences.getWatchEnabled()) { - frameLayout.setVisibility(View.VISIBLE); + @Override + public int getViewTypeCount() { + return 2; + } - TextView itemCount = (TextView) view.findViewById(R.id.drawer_item_count); + @Override + public int getItemViewType(final int position) { + return position == 0 ? VIEW_TYPE_HEADER : VIEW_TYPE_ITEM; + } - if (item.isError) { - itemCount.setText("Err"); + @Override + public Pin getItem(final int position) { + switch (getItemViewType(position)) { + case VIEW_TYPE_ITEM: + int itemPosition = position - 1; + if (itemPosition >= 0 && itemPosition < pins.size()) { + return pins.get(itemPosition); } else { - int count = item.getNewPostsCount(); - String total = Integer.toString(count); - if (count > 999) { - total = "1k+"; - } - itemCount.setText(total); + return null; } + case VIEW_TYPE_HEADER: + return null; + default: + return null; + } + } - itemCount.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - item.toggleWatch(); - } - }); - - if (!item.watching) { - frameLayout.setBackgroundResource(R.drawable.pin_icon_gray); - } else if (item.getNewQuoteCount() > 0) { - frameLayout.setBackgroundResource(R.drawable.pin_icon_red); + @Override + public long getItemId(int position) { + switch (getItemViewType(position)) { + case VIEW_TYPE_ITEM: + int itemPosition = position - 1; + if (itemPosition >= 0 && itemPosition < pins.size()) { + return pins.get(itemPosition).id; } else { - frameLayout.setBackgroundResource(R.drawable.pin_icon_blue); + return -1; } - } else { - frameLayout.setVisibility(View.GONE); - } + case VIEW_TYPE_HEADER: + return -1; + default: + return -1; } + } - return view; + @Override + public boolean hasStableIds() { + return true; } - public void reload() { - clear(); + @Override + public View getView(int position, View convertView, ViewGroup parent) { + switch (getItemViewType(position)) { + case VIEW_TYPE_ITEM: { + final Pin item = getItem(position); - Pin header = new Pin(); - header.type = Pin.Type.HEADER; - add(header); + if (convertView == null) { + convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item, null); + } - addAll(ChanApplication.getPinnedManager().getPins()); + ((TextView) convertView.findViewById(R.id.drawer_item_text)).setText(item.loadable.title); - notifyDataSetChanged(); - } + FrameLayout frameLayout = (FrameLayout) convertView.findViewById(R.id.drawer_item_count_container); + if (ChanPreferences.getWatchEnabled()) { + frameLayout.setVisibility(View.VISIBLE); - @Override - public void remove(Pin item) { - super.remove(item); - idMap.remove(item); - notifyDataSetChanged(); - } + TextView itemCount = (TextView) convertView.findViewById(R.id.drawer_item_count); - @Override - public void add(Pin item) { - idMap.put(item, ++idCounter); - super.add(item); - notifyDataSetChanged(); - } + if (item.isError) { + itemCount.setText("Err"); + } else { + int count = item.getNewPostsCount(); + String total = Integer.toString(count); + if (count > 999) { + total = "1k+"; + } + itemCount.setText(total); + } - @Override - public boolean hasStableIds() { - return true; - } + itemCount.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + item.toggleWatch(); + } + }); + + if (!item.watching) { + frameLayout.setBackgroundResource(R.drawable.pin_icon_gray); + } else if (item.getNewQuoteCount() > 0) { + frameLayout.setBackgroundResource(R.drawable.pin_icon_red); + } else { + frameLayout.setBackgroundResource(R.drawable.pin_icon_blue); + } + } else { + frameLayout.setVisibility(View.GONE); + } - @Override - public long getItemId(int position) { - if (position < 0 || position >= getCount()) - return -1; - - Pin item = getItem(position); - if (item == null) { - return -1; - } else { - Integer i = idMap.get(item); - if (i == null) { - return -1; - } else { - return i; + return convertView; + } + case VIEW_TYPE_HEADER: { + if (convertView == null) { + convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item_header, null); + ((TextView) convertView.findViewById(R.id.drawer_item_header)).setText(R.string.drawer_pinned); + } + + return convertView; } + default: + return null; } } + + public void reload() { + pins.clear(); + pins.addAll(ChanApplication.getPinnedManager().getPins()); + + notifyDataSetChanged(); + } }