package net.dev123.yibo.service.adapter;
import java.util.ArrayList;
import java.util.List;
import net.dev123.commons.util.ListUtil;
import net.dev123.mblog.entity.Group;
import net.dev123.mblog.entity.Status;
import net.dev123.yibo.R;
import net.dev123.yibo.common.theme.ThemeUtil;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.db.LocalStatus;
import net.dev123.yibo.service.task.GroupStatusesPageDownTask;
import net.dev123.yibo.service.task.GroupStatusesPageUpTask;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
public class GroupStatusesListAdapter extends CacheAdapter<Status> {
private Group group;
private List<Status> statusList;
public GroupStatusesListAdapter(Context context, LocalAccount account, Group group) {
super(context, account);
this.group = group;
statusList = new ArrayList<Status>();
GroupStatusesPageUpTask task = new GroupStatusesPageUpTask(this);
task.execute();
}
@Override
public int getCount() {
return statusList.size();
}
@Override
public Object getItem(int position) {
if (position < 0 || position >= statusList.size()) {
return null;
}
return statusList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object obj = getItem(position);
Status status = (Status) obj;
if (status == null) {
return convertView;
}
if (status instanceof LocalStatus
&& ((LocalStatus)status).isDivider()) {
LocalStatus localStatus = (LocalStatus)status;
convertView = fillInDividerView(convertView, localStatus, position);
} else {
convertView = StatusUtil.initConvertView(context, convertView, account.getServiceProvider());
StatusUtil.fillConvertView(convertView, status);
}
return convertView;
}
private View fillInDividerView(View convertView, final LocalStatus status, final int position) {
if (status == null || !status.isDivider()) {
return null;
}
if (getItemViewType(position) == ITEM_VIEW_TYPE_REMOTE_DIVIDER) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_gap, null);
ThemeUtil.setListViewGap(convertView);
}
View llLoadingState = convertView.findViewById(R.id.llLoadingState);
if (status.isLoading()) {
llLoadingState.setVisibility(View.VISIBLE);
} else {
llLoadingState.setVisibility(View.GONE);
}
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setClickable(false);
v.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE);
Status max = (Status)getItem(position - 1);
Status since = (Status)getItem(position + 1);
GroupStatusesPageDownTask task = new GroupStatusesPageDownTask(
GroupStatusesListAdapter.this, status);
task.execute(max, since);
}
});
} else {
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_more, null);
ThemeUtil.setListViewMore(convertView);
}
if (status.isLoading()) {
convertView.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE);
convertView.findViewById(R.id.tvFooter).setVisibility(View.GONE);
} else {
convertView.findViewById(R.id.llLoadingState).setVisibility(View.GONE);
convertView.findViewById(R.id.tvFooter).setVisibility(View.VISIBLE);
}
if (paging.hasNext()) {
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setClickable(false);
v.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE);
v.findViewById(R.id.tvFooter).setVisibility(View.GONE);
Status max = (Status)getItem(position - 1);
Status since = (Status)getItem(position + 1);
GroupStatusesPageDownTask task = new GroupStatusesPageDownTask(
GroupStatusesListAdapter.this, status);
task.execute(max, since);
}
});
} else {
((TextView)convertView.findViewById(R.id.tvFooter)).setText(R.string.label_no_more);
}
}
return convertView;
}
@Override
public boolean addCacheToFirst(List<Status> list) {
if (ListUtil.isEmpty(list)) {
return false;
}
statusList.addAll(0, list);
this.notifyDataSetChanged();
return true;
}
@Override
public boolean addCacheToDivider(Status value, List<Status> list) {
if (value == null || ListUtil.isEmpty(list)) {
return false;
}
int pos = statusList.indexOf(value);
if (pos == -1) {
return false;
}
statusList.remove(pos);
statusList.addAll(pos, list);
this.notifyDataSetChanged();
return false;
}
@Override
public boolean addCacheToLast(List<Status> list) {
if (ListUtil.isEmpty(list)) {
return false;
}
statusList.addAll(list);
this.notifyDataSetChanged();
return true;
}
@Override
public Status getMax() {
if (statusList.size() == 0) {
return null;
}
return statusList.get(0);
}
@Override
public Status getMin() {
if (statusList.size() == 0) {
return null;
}
return statusList.get(getCount() - 1);
}
@Override
public void clear() {
statusList.clear();
}
@Override
public int getItemViewType(int position) {
Status status = (Status)getItem(position);
if (status == null) {
return ITEM_VIEW_TYPE_REMOTE_DIVIDER;
}
if (!(status instanceof LocalStatus)) {
return ITEM_VIEW_TYPE_DATA;
}
LocalStatus localStatus = (LocalStatus)status;
if (!localStatus.isDivider()) {
return ITEM_VIEW_TYPE_DATA;
}
if (localStatus.isLocalDivider()) {
return ITEM_VIEW_TYPE_LOCAL_DIVIDER;
}
return ITEM_VIEW_TYPE_REMOTE_DIVIDER;
}
@Override
public int getViewTypeCount() {
return 3;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
if (group == null || group.equals(this.group)) {
return;
}
this.group = group;
clear();
this.notifyDataSetChanged();
}
}