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
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

@ -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();
}

@ -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<Pin> {
private final HashMap<Pin, Integer> 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<Pin>());
private Context context;
private List<Pin> 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();
}
}

Loading…
Cancel
Save