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. 143
      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,40 +32,90 @@ 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; @Override
public int getViewTypeCount() {
return 2;
}
final Pin item = getItem(position); @Override
public int getItemViewType(final int position) {
return position == 0 ? VIEW_TYPE_HEADER : VIEW_TYPE_ITEM;
}
if (item.type == Pin.Type.HEADER) { @Override
view = (LinearLayout) inflater.inflate(R.layout.pin_item_header, null); 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 {
return null;
}
case VIEW_TYPE_HEADER:
return null;
default:
return null;
}
}
((TextView) view.findViewById(R.id.drawer_item_header)).setText(R.string.drawer_pinned); @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 { } else {
view = (LinearLayout) inflater.inflate(R.layout.pin_item, null); return -1;
}
case VIEW_TYPE_HEADER:
return -1;
default:
return -1;
}
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM: {
final Pin item = getItem(position);
((TextView) view.findViewById(R.id.drawer_item_text)).setText(item.loadable.title); if (convertView == null) {
convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item, null);
}
((TextView) convertView.findViewById(R.id.drawer_item_text)).setText(item.loadable.title);
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.drawer_item_count_container); FrameLayout frameLayout = (FrameLayout) convertView.findViewById(R.id.drawer_item_count_container);
if (ChanPreferences.getWatchEnabled()) { if (ChanPreferences.getWatchEnabled()) {
frameLayout.setVisibility(View.VISIBLE); frameLayout.setVisibility(View.VISIBLE);
TextView itemCount = (TextView) view.findViewById(R.id.drawer_item_count); TextView itemCount = (TextView) convertView.findViewById(R.id.drawer_item_count);
if (item.isError) { if (item.isError) {
itemCount.setText("Err"); itemCount.setText("Err");
@ -95,57 +145,26 @@ public class PinnedAdapter extends ArrayAdapter<Pin> {
} else { } else {
frameLayout.setVisibility(View.GONE); frameLayout.setVisibility(View.GONE);
} }
}
return view; return convertView;
} }
case VIEW_TYPE_HEADER: {
public void reload() { if (convertView == null) {
clear(); 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);
Pin header = new Pin();
header.type = Pin.Type.HEADER;
add(header);
addAll(ChanApplication.getPinnedManager().getPins());
notifyDataSetChanged();
} }
@Override return convertView;
public void remove(Pin item) {
super.remove(item);
idMap.remove(item);
notifyDataSetChanged();
} }
default:
@Override return null;
public void add(Pin item) {
idMap.put(item, ++idCounter);
super.add(item);
notifyDataSetChanged();
} }
@Override
public boolean hasStableIds() {
return true;
} }
@Override public void reload() {
public long getItemId(int position) { pins.clear();
if (position < 0 || position >= getCount()) pins.addAll(ChanApplication.getPinnedManager().getPins());
return -1;
Pin item = getItem(position); notifyDataSetChanged();
if (item == null) {
return -1;
} else {
Integer i = idMap.get(item);
if (i == null) {
return -1;
} else {
return i;
}
}
} }
} }

Loading…
Cancel
Save