Give PinnedAdapter proper itemViewType powers.

captchafix
Florens Douwes 11 years ago
parent bfd2e8ae9f
commit 2ea38683fc
  1. 12
      Clover/app/src/main/java/org/floens/chan/core/model/Pin.java
  2. 9
      Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java
  3. 197
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java

@ -25,24 +25,12 @@ import org.floens.chan.core.watch.PinWatcher;
@DatabaseTable @DatabaseTable
public class Pin { public class Pin {
// Database stuff
@DatabaseField(generatedId = true) @DatabaseField(generatedId = true)
public int id; public int id;
@DatabaseField(canBeNull = false, foreign = true) @DatabaseField(canBeNull = false, foreign = true)
public Loadable loadable = new Loadable("", -1); 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; public PinWatcher pinWatcher;
@DatabaseField @DatabaseField

@ -147,7 +147,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
pinDrawerView = (ListView) findViewById(R.id.left_drawer); 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(); pinnedAdapter.reload();
pinDrawerView.setAdapter(pinnedAdapter); pinDrawerView.setAdapter(pinnedAdapter);
@ -155,7 +155,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Pin pin = pinnedAdapter.getItem(position); Pin pin = pinnedAdapter.getItem(position);
if (pin == null || pin.type == Pin.Type.HEADER) if (pin == null)
return; return;
openPin(pin); openPin(pin);
} }
@ -165,7 +165,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
@Override @Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Pin post = pinnedAdapter.getItem(position); Pin post = pinnedAdapter.getItem(position);
if (post == null || post.type == Pin.Type.HEADER) if (post == null)
return false; return false;
changePinTitle(post); changePinTitle(post);
@ -185,7 +185,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
@Override @Override
public boolean canDismiss(int position) { 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 @Override
public void onPinsChanged() { public void onPinsChanged() {
pinnedAdapter.reload(); pinnedAdapter.reload();
pinDrawerView.invalidate();
updateIcon(); updateIcon();
} }

@ -21,7 +21,7 @@ import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.BaseAdapter;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
@ -32,120 +32,139 @@ import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Pin;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.List;
public class PinnedAdapter extends ArrayAdapter<Pin> { public class PinnedAdapter extends BaseAdapter {
private final HashMap<Pin, Integer> idMap; private final static int VIEW_TYPE_ITEM = 0;
private int idCounter; private final static int VIEW_TYPE_HEADER = 1;
public PinnedAdapter(Context context, int resId) { private Context context;
super(context, resId, new ArrayList<Pin>()); private List<Pin> pins = new ArrayList<>();
idMap = new HashMap<>(); public PinnedAdapter(Context context) {
this.context = context;
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public int getCount() {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); return pins.size() + 1;
}
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);
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.drawer_item_count_container); @Override
if (ChanPreferences.getWatchEnabled()) { public int getViewTypeCount() {
frameLayout.setVisibility(View.VISIBLE); 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) { @Override
itemCount.setText("Err"); 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 { } else {
int count = item.getNewPostsCount(); return null;
String total = Integer.toString(count);
if (count > 999) {
total = "1k+";
}
itemCount.setText(total);
} }
case VIEW_TYPE_HEADER:
return null;
default:
return null;
}
}
itemCount.setOnClickListener(new View.OnClickListener() { @Override
@Override public long getItemId(int position) {
public void onClick(View v) { switch (getItemViewType(position)) {
item.toggleWatch(); case VIEW_TYPE_ITEM:
} int itemPosition = position - 1;
}); if (itemPosition >= 0 && itemPosition < pins.size()) {
return pins.get(itemPosition).id;
if (!item.watching) {
frameLayout.setBackgroundResource(R.drawable.pin_icon_gray);
} else if (item.getNewQuoteCount() > 0) {
frameLayout.setBackgroundResource(R.drawable.pin_icon_red);
} else { } else {
frameLayout.setBackgroundResource(R.drawable.pin_icon_blue); return -1;
} }
} else { case VIEW_TYPE_HEADER:
frameLayout.setVisibility(View.GONE); return -1;
} default:
return -1;
} }
}
return view; @Override
public boolean hasStableIds() {
return true;
} }
public void reload() { @Override
clear(); 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(); if (convertView == null) {
header.type = Pin.Type.HEADER; convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item, null);
add(header); }
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 TextView itemCount = (TextView) convertView.findViewById(R.id.drawer_item_count);
public void remove(Pin item) {
super.remove(item);
idMap.remove(item);
notifyDataSetChanged();
}
@Override if (item.isError) {
public void add(Pin item) { itemCount.setText("Err");
idMap.put(item, ++idCounter); } else {
super.add(item); int count = item.getNewPostsCount();
notifyDataSetChanged(); String total = Integer.toString(count);
} if (count > 999) {
total = "1k+";
}
itemCount.setText(total);
}
@Override itemCount.setOnClickListener(new View.OnClickListener() {
public boolean hasStableIds() { @Override
return true; 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 return convertView;
public long getItemId(int position) { }
if (position < 0 || position >= getCount()) case VIEW_TYPE_HEADER: {
return -1; if (convertView == null) {
convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item_header, null);
Pin item = getItem(position); ((TextView) convertView.findViewById(R.id.drawer_item_header)).setText(R.string.drawer_pinned);
if (item == null) { }
return -1;
} else { return convertView;
Integer i = idMap.get(item);
if (i == null) {
return -1;
} else {
return i;
} }
default:
return null;
} }
} }
public void reload() {
pins.clear();
pins.addAll(ChanApplication.getPinnedManager().getPins());
notifyDataSetChanged();
}
} }

Loading…
Cancel
Save