/*
* Copyright (c) 2014. Marshal Chen.
*/
package com.marshalchen.common.demoofui.dragSortListview;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.content.Context;
import android.app.ListActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.MotionEvent;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.graphics.drawable.Drawable;
import android.graphics.Point;
import android.util.Log;
import com.marshalchen.common.demoofui.R;
import com.marshalchen.common.uimodule.dragSortListView.DragSortListView;
import com.marshalchen.common.uimodule.dragSortListView.DragSortController;
public class Sections extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drag_sort_listview_sections_main);
DragSortListView dslv = (DragSortListView) getListView();
// get jazz artist names and make adapter
String[] array = getResources().getStringArray(R.array.jazz_artist_names);
List<String> list = new ArrayList<String>(Arrays.asList(array));
SectionAdapter adapter = new SectionAdapter(this, list);
dslv.setDropListener(adapter);
// make and set controller on dslv
SectionController c = new SectionController(dslv, adapter);
dslv.setFloatViewManager(c);
dslv.setOnTouchListener(c);
// pass it to the ListActivity
setListAdapter(adapter);
}
private class SectionController extends DragSortController {
private int mPos;
private int mDivPos;
private SectionAdapter mAdapter;
DragSortListView mDslv;
public SectionController(DragSortListView dslv, SectionAdapter adapter) {
super(dslv, R.id.text, DragSortController.ON_DOWN, 0);
setRemoveEnabled(false);
mDslv = dslv;
mAdapter = adapter;
mDivPos = adapter.getDivPosition();
}
@Override
public int startDragPosition(MotionEvent ev) {
int res = super.dragHandleHitPosition(ev);
if (res == mDivPos) {
return DragSortController.MISS;
}
int width = mDslv.getWidth();
if ((int) ev.getX() < width / 3) {
return res;
} else {
return DragSortController.MISS;
}
}
@Override
public View onCreateFloatView(int position) {
mPos = position;
View v = mAdapter.getView(position, null, mDslv);
if (position < mDivPos) {
v.setBackgroundDrawable(getResources().getDrawable(R.drawable.drag_sort_listview_bg_handle_section1));
} else {
v.setBackgroundDrawable(getResources().getDrawable(R.drawable.drag_sort_listview_bg_handle_section2));
}
v.getBackground().setLevel(10000);
return v;
}
private int origHeight = -1;
@Override
public void onDragFloatView(View floatView, Point floatPoint, Point touchPoint) {
final int first = mDslv.getFirstVisiblePosition();
final int lvDivHeight = mDslv.getDividerHeight();
if (origHeight == -1) {
origHeight = floatView.getHeight();
}
View div = mDslv.getChildAt(mDivPos - first);
if (touchPoint.x > mDslv.getWidth() / 2) {
float scale = touchPoint.x - mDslv.getWidth() / 2;
scale /= (float) (mDslv.getWidth() / 5);
ViewGroup.LayoutParams lp = floatView.getLayoutParams();
lp.height = Math.max(origHeight, (int) (scale * origHeight));
Log.d("mobeta", "setting height "+lp.height);
floatView.setLayoutParams(lp);
}
if (div != null) {
if (mPos > mDivPos) {
// don't allow floating View to go above
// section divider
final int limit = div.getBottom() + lvDivHeight;
if (floatPoint.y < limit) {
floatPoint.y = limit;
}
} else {
// don't allow floating View to go below
// section divider
final int limit = div.getTop() - lvDivHeight - floatView.getHeight();
if (floatPoint.y > limit) {
floatPoint.y = limit;
}
}
}
}
@Override
public void onDestroyFloatView(View floatView) {
//do nothing; block super from crashing
}
}
private class SectionAdapter extends BaseAdapter implements DragSortListView.DropListener {
private final static int SECTION_DIV = 0;
private final static int SECTION_ONE = 1;
private final static int SECTION_TWO = 2;
private List<String> mData;
private int mDivPos;
private LayoutInflater mInflater;
public SectionAdapter(Context context, List<String> names) {
super();
mInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
mData = names;
mDivPos = names.size() / 2;
}
@Override
public void drop(int from, int to) {
if (from != to) {
String data = mData.remove(dataPosition(from));
mData.add(dataPosition(to), data);
notifyDataSetChanged();
}
}
@Override
public int getCount() {
return mData.size() + 1;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return position != mDivPos;
}
public int getDivPosition() {
return mDivPos;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public String getItem(int position) {
if (position == mDivPos) {
return "Something";
} else {
return mData.get(dataPosition(position));
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
if (position == mDivPos) {
return SECTION_DIV;
} else if (position < mDivPos) {
return SECTION_ONE;
} else {
return SECTION_TWO;
}
}
private int dataPosition(int position) {
return position > mDivPos ? position - 1 : position;
}
public Drawable getBGDrawable(int type) {
Drawable d;
if (type == SECTION_ONE) {
d = getResources().getDrawable(R.drawable.drag_sort_listview_bg_handle_section1_selector);
} else {
d = getResources().getDrawable(R.drawable.drag_sort_listview_bg_handle_section2_selector);
}
d.setLevel(3000);
return d;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int type = getItemViewType(position);
View v = null;
if (convertView != null) {
Log.d("mobeta", "using convertView");
v = convertView;
} else if (type != SECTION_DIV) {
Log.d("mobeta", "inflating normal item");
v = mInflater.inflate(R.layout.drag_sort_listview_list_item_bg_handle, parent, false);
v.setBackgroundDrawable(getBGDrawable(type));
} else {
Log.d("mobeta", "inflating section divider");
v = mInflater.inflate(R.layout.drag_sort_listview_section_div, parent, false);
}
if (type != SECTION_DIV) {
// bind data
((TextView) v).setText(mData.get(dataPosition(position)));
}
return v;
}
}
}