可以左右滑动的ListView

package cn.com.test;


import java.util.ArrayList;


import cn.com.test.ScrollListView.OnHeaderClickedListener;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;


public class DraftTestActivity extends Activity {


private String[][] mItems = new String[20][11];

ScrollListView sl;

public ArrayList<View> mArrayListMovable = new ArrayList<View>();


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


sl = (ScrollListView) findViewById(R.id.scrollListView);


for (int i = 0; i < 20; i++) {
for (int j = 0; j < 11; j++) {
mItems[i][j] = "items" + i + j;
}
}



sl.setScrollListViewAdapter(new ScrollListViewAdapter());

sl.setMovabaleView(mArrayListMovable);
//listView µã»÷
sl.setOnItemClickedListener(new OnItemClickListener() {


public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
TextView code = (TextView)view.findViewById(R.id.fixTxt01);
String str = code.getText().toString();
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
});
//ÁÐÍ·µã»÷
sl.setOnHeaderClickedListener(new OnHeaderClickedListener() {

public void onClick(int headerID, int direction) {


Toast.makeText(getApplicationContext(), "headerID"+headerID, Toast.LENGTH_SHORT).show();
}
});

}

class ScrollListViewAdapter extends BaseAdapter {


public int getCount() {
return mItems.length;
}


public Object getItem(int position) {
return position;
}


public long getItemId(int position) {
return 0;
}


public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout view = new LinearLayout(getApplicationContext());
view.setOrientation(LinearLayout.HORIZONTAL);
if (convertView == null) {
//¹Ì¶šµÄÁÐ
View viewFix = getLayoutInflater().inflate(R.layout.funds_list_fix_items,
parent, false);
//¿ÉÒÔ»¬¶¯µÄÁÐ(LayoutµÄžù²ŒŸÖ±ØÐëÊÇLinearLayout,Ô­Òò²»Ã÷)
View viewMovable = getLayoutInflater().inflate(R.layout.funds_list_movable_items,
parent, false);
view.addView(viewFix);
view.addView(viewMovable);
Log.e("TEST", "²âÊÔgetViewŽÎÊý");

} else {
view = (LinearLayout)convertView;
}
ViewHolder holder = (ViewHolder) view.getTag();
if (holder == null) {
holder = new ViewHolder();
holder.fixTxt01 = (TextView) view.findViewById(R.id.fixTxt01);
holder.fixTxt02 = (TextView) view.findViewById(R.id.fixTxt02);
holder.txt01 = (TextView) view.findViewById(R.id.txt01);
holder.txt02 = (TextView) view.findViewById(R.id.txt02);
holder.txt03 = (TextView) view.findViewById(R.id.txt03);
holder.txt04 = (TextView) view.findViewById(R.id.txt04);
holder.txt05 = (TextView) view.findViewById(R.id.txt05);
holder.txt06 = (TextView) view.findViewById(R.id.txt06);
holder.txt07 = (TextView) view.findViewById(R.id.txt07);
holder.txt08 = (TextView) view.findViewById(R.id.txt08);
holder.txt09 = (TextView) view.findViewById(R.id.txt09);


view.setTag(holder);
}
holder.fixTxt01.setText(mItems[position][9]);
holder.fixTxt02.setText(mItems[position][10]);
holder.txt01.setText(mItems[position][0]);
holder.txt02.setText(mItems[position][1]);
holder.txt03.setText(mItems[position][2]);
holder.txt04.setText(mItems[position][3]);
holder.txt05.setText(mItems[position][4]);
holder.txt06.setText(mItems[position][5]);
holder.txt07.setText(mItems[position][6]);
holder.txt08.setText(mItems[position][7]);
holder.txt09.setText(mItems[position][8]);
mArrayListMovable.add(view.getChildAt(1));
return view;
}
}


class ViewHolder {
TextView txt01;
TextView txt02;
TextView txt03;
TextView txt04;
TextView txt05;
TextView txt06;
TextView txt07;
TextView txt08;
TextView txt09;
TextView fixTxt01;
TextView fixTxt02;



}

}


package cn.com.test;


import java.util.ArrayList;


import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class ScrollListView extends RelativeLayout {


private Context mContext;
/**
* ÁбíÍ·µÄžßºÍ¿í
*/
private int mTitleHeight = 30;
private int mTitleWidth = 60;
/**
* ¿É¹ö¶¯ºÍ²»¿É¹ö¶¯ÁÐÍ·µÄÃû³Æ
*/
private String[] mTitleMovableStr = { "²âÊÔ1", "²âÊÔ2", "²âÊÔ3", "²âÊÔ4", "²âÊÔ5",
"²âÊÔ6", "²âÊÔ7", "²âÊÔ8", "²âÊÔ9" };
private String[] mTitleFixStr = { "²âÊÔ10", "²âÊÔ11" };


private LinearLayout mLayoutTitleMovable;
private LinearLayout mLayoutHeader;


private LinearLayout mLayoutListMovable;




private ListView listViewMovable;


private ArrayList<View> mArrayList;

public ScrollListView(Context context) {
super(context);
mContext = context;
}


public ScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
// ListView¿ÉÒƶ¯ÇøÓò
mLayoutListMovable = new LinearLayout(mContext);
mLayoutListMovable.setOrientation(LinearLayout.VERTICAL);


LayoutParams scrollListLp = new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
this.addView(buidScrollListView(), scrollListLp);


}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}


/**
* ¿É¹ö¶¯µÃÁбíÍ·
*
* @return
*/
private View buildMovableHead() {
LinearLayout relativeLayout = new LinearLayout(mContext);
for (int i = 0; i < mTitleMovableStr.length; i++) {


TextView tx = new TextView(mContext);
tx.setText(mTitleMovableStr[i]);
tx.setGravity(Gravity.CENTER);
tx.setBackgroundColor(Color.GREEN);
relativeLayout.addView(tx, mTitleWidth, mTitleHeight);
}
mLayoutTitleMovable = relativeLayout;
return relativeLayout;
}


/**
* ²»¿É¹ö¶¯µÃÁбíÍ·
*
* @return
*/
private View buildFixHead() {
LinearLayout relativeLayout = new LinearLayout(mContext);
for (int i = 0; i < mTitleFixStr.length; i++) {
TextView tx = new TextView(mContext);
tx.setText(mTitleFixStr[i]);
tx.setGravity(Gravity.CENTER);
tx.setBackgroundColor(Color.RED);
relativeLayout.addView(tx, i, new LayoutParams(mTitleWidth,
mTitleHeight));
}
return relativeLayout;
}


/**
* ºÏ²¢ÁÐÍ·
*
* @return
*/
private View buildHeadLayout() {
LinearLayout relativeLayout = new LinearLayout(mContext);
relativeLayout.addView(buildFixHead());
relativeLayout.addView(buildMovableHead());
mLayoutHeader = relativeLayout;
return relativeLayout;
}


/**
* ListView
*
* @return
*/
private View buildMoveableListView() {
LinearLayout relativeLayout = new LinearLayout(mContext);
listViewMovable = new ListView(mContext);
listViewMovable.setCacheColorHint(00000000);
relativeLayout.addView(listViewMovable);
return relativeLayout;


}


private View buidScrollListView() {
LinearLayout relativeLayout = new LinearLayout(mContext);
relativeLayout.setOrientation(LinearLayout.VERTICAL);
relativeLayout.addView(buildHeadLayout());
relativeLayout.addView(buildMoveableListView());
return relativeLayout;
}


// Ž¥Ãþ¿ªÊŒÊ±XµÄλÖÃ
private float mStartX = 0;
private float mStartY = 0;
// XÖá·œÏòµÄÆ«ÒÆÁ¿
private int mOffsetX = 0;


private int fixX = 0;


@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {


switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartX = ev.getX();
mStartY = ev.getY();
Log.e("TEST", "ÖжϰŽÏÂx= " + ev.getX());
break;
case MotionEvent.ACTION_MOVE:
Log.e("TEST", "ÖжÏÒƶ¯x= " + ev.getX());
int offsetX = (int) Math.abs(ev.getX() - mStartX);
if (offsetX > 30) {
return true;
} else {
return false;
}


case MotionEvent.ACTION_UP:
Log.e("TEST", "ÖжÏ̧Æðx= " + ev.getX());
actionUP();
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e("TEST", "Òƶ¯°ŽÏÂx= " + ev.getX());
return true;
case MotionEvent.ACTION_MOVE:
int offsetX = (int) Math.abs(ev.getX() - mStartX);
if (offsetX > 30) {
Log.e("TEST", "Òƶ¯Æ«ÒÆ" + offsetX);
mOffsetX = (int) (mStartX - ev.getX());
mLayoutTitleMovable.scrollTo(mOffsetX, 0);
for (int i = 0; i < mArrayList.size(); i++) {


mArrayList.get(i).scrollTo(mOffsetX, 0);
}
Log.e("TEST", "ListÊýÁ¿" + mArrayList.size());
// mLayoutMovable.scrollTo(mOffsetX, 0);
}
break;
case MotionEvent.ACTION_UP:
Log.e("TEST", "Òƶ¯Ì§Æðx= " + ev.getX());
fixX = (int) ((int) ev.getX() - mStartX);
actionUP();
break;


default:
break;
}


return super.onTouchEvent(ev);
}


/**
* Ž¥Ãþ̧Æð
*/
private void actionUP() {
if (fixX > 0) {
mLayoutTitleMovable.scrollTo(0, 0);
for (int i = 0; i < mArrayList.size(); i++) {
mArrayList.get(i).scrollTo(0, 0);
}
// mLayoutMovable.scrollTo(0, 0);
} else {
if ((mLayoutTitleMovable.getWidth() + Math.abs(fixX)) > mTitleWidth
* mTitleMovableStr.length) {
mLayoutTitleMovable.scrollTo(mTitleWidth
* mTitleMovableStr.length-mLayoutTitleMovable.getWidth(), 0);
for (int i = 0; i < mArrayList.size(); i++) {
mArrayList.get(i).scrollTo(mTitleWidth
* mTitleMovableStr.length-mLayoutTitleMovable.getWidth(), 0);
}
// mLayoutMovable.scrollTo(0, 0);
}


}
}


/**
* ÉèÖÿɱäµÄÁбíÍ·ÐÅÏ¢
*
* @param str
* ÁбíÍ·ÏÔÊŸµÄÃû³Æ
*/
public void setMovableHead(String[] str) {
mTitleMovableStr = str;
}


/**
* ÉèÖò»¿É±äµÄÁбíÍ·ÐÅÏ¢
*
* @param str
* ÁбíÍ·ÏÔÊŸµÄÃû³Æ
* @param height
* ÁбíÍ·µÄžß¶È
* @param width
* ÁбíÍ·µÄ¿í¶È
*/
public void setFixHead(String[] str, int height, int width) {
mTitleHeight = height;
mTitleWidth = width;
mTitleFixStr = str;
}

public View getHeaderLayout(){
return mLayoutHeader;
}


/**
* ÉèÖÃListView ÊÊÅäÆ÷
*
* @param adapter
*/
public void setScrollListViewAdapter(
BaseAdapter movableAdapter) {
// listViewFix.setAdapter(fixAdapter);
listViewMovable.setAdapter(movableAdapter);

}
/**
* ¿É×óÓÒ»¬¶¯ViewŒ¯ºÏ
* @param movableView
*/
public void setMovabaleView(ArrayList<View> movableView) {
mArrayList = movableView;
}

/**
* listView µã»÷
* @param onItemClickedListener
*/
public void setOnItemClickedListener(
OnItemClickListener onItemClickListener) {

listViewMovable.setOnItemClickListener(onItemClickListener);
}
/**
* ÁÐÍ·µã»÷ÊÂŒþ
* @param onHeaderClickedListener
*/
public void setOnHeaderClickedListener(
OnHeaderClickedListener onHeaderClickedListener) {
// onHeaderClickedListener.
// mLayoutHeader.getChildAt(0).setOnClickListener(l);
}


/**
* ÁÐÍ·µã»÷ÊÂŒþ
*
* @createTime 2011-9-26
* @company ÉîÛÚÊÐŽŽÕæ¿ÆŒŒ
* @author niuxuehao
*/
public static interface OnHeaderClickedListener {
public void onClick(int headerID, int direction);


}
}

package cn.com.test;


import java.util.ArrayList;


import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class ScrollListView extends RelativeLayout {


private Context mContext;
/**
* ÁбíÍ·µÄžßºÍ¿í
*/
private int mTitleHeight = 30;
private int mTitleWidth = 60;
/**
* ¿É¹ö¶¯ºÍ²»¿É¹ö¶¯ÁÐÍ·µÄÃû³Æ
*/
private String[] mTitleMovableStr = { "²âÊÔ1", "²âÊÔ2", "²âÊÔ3", "²âÊÔ4", "²âÊÔ5",
"²âÊÔ6", "²âÊÔ7", "²âÊÔ8", "²âÊÔ9" };
private String[] mTitleFixStr = { "²âÊÔ10", "²âÊÔ11" };


private LinearLayout mLayoutTitleMovable;
private LinearLayout mLayoutHeader;


private LinearLayout mLayoutListMovable;




private ListView listViewMovable;


private ArrayList<View> mArrayList;

public ScrollListView(Context context) {
super(context);
mContext = context;
}


public ScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
// ListView¿ÉÒƶ¯ÇøÓò
mLayoutListMovable = new LinearLayout(mContext);
mLayoutListMovable.setOrientation(LinearLayout.VERTICAL);


LayoutParams scrollListLp = new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
this.addView(buidScrollListView(), scrollListLp);


}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}


/**
* ¿É¹ö¶¯µÃÁбíÍ·
*
* @return
*/
private View buildMovableHead() {
LinearLayout relativeLayout = new LinearLayout(mContext);
for (int i = 0; i < mTitleMovableStr.length; i++) {


TextView tx = new TextView(mContext);
tx.setText(mTitleMovableStr[i]);
tx.setGravity(Gravity.CENTER);
tx.setBackgroundColor(Color.GREEN);
relativeLayout.addView(tx, mTitleWidth, mTitleHeight);
}
mLayoutTitleMovable = relativeLayout;
return relativeLayout;
}


/**
* ²»¿É¹ö¶¯µÃÁбíÍ·
*
* @return
*/
private View buildFixHead() {
LinearLayout relativeLayout = new LinearLayout(mContext);
for (int i = 0; i < mTitleFixStr.length; i++) {
TextView tx = new TextView(mContext);
tx.setText(mTitleFixStr[i]);
tx.setGravity(Gravity.CENTER);
tx.setBackgroundColor(Color.RED);
relativeLayout.addView(tx, i, new LayoutParams(mTitleWidth,
mTitleHeight));
}
return relativeLayout;
}


/**
* ºÏ²¢ÁÐÍ·
*
* @return
*/
private View buildHeadLayout() {
LinearLayout relativeLayout = new LinearLayout(mContext);
relativeLayout.addView(buildFixHead());
relativeLayout.addView(buildMovableHead());
mLayoutHeader = relativeLayout;
return relativeLayout;
}


/**
* ListView
*
* @return
*/
private View buildMoveableListView() {
LinearLayout relativeLayout = new LinearLayout(mContext);
listViewMovable = new ListView(mContext);
listViewMovable.setCacheColorHint(00000000);
relativeLayout.addView(listViewMovable);
return relativeLayout;


}


private View buidScrollListView() {
LinearLayout relativeLayout = new LinearLayout(mContext);
relativeLayout.setOrientation(LinearLayout.VERTICAL);
relativeLayout.addView(buildHeadLayout());
relativeLayout.addView(buildMoveableListView());
return relativeLayout;
}


// Ž¥Ãþ¿ªÊŒÊ±XµÄλÖÃ
private float mStartX = 0;
private float mStartY = 0;
// XÖá·œÏòµÄÆ«ÒÆÁ¿
private int mOffsetX = 0;


private int fixX = 0;


@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {


switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartX = ev.getX();
mStartY = ev.getY();
Log.e("TEST", "ÖжϰŽÏÂx= " + ev.getX());
break;
case MotionEvent.ACTION_MOVE:
Log.e("TEST", "ÖжÏÒƶ¯x= " + ev.getX());
int offsetX = (int) Math.abs(ev.getX() - mStartX);
if (offsetX > 30) {
return true;
} else {
return false;
}


case MotionEvent.ACTION_UP:
Log.e("TEST", "ÖжÏ̧Æðx= " + ev.getX());
actionUP();
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e("TEST", "Òƶ¯°ŽÏÂx= " + ev.getX());
return true;
case MotionEvent.ACTION_MOVE:
int offsetX = (int) Math.abs(ev.getX() - mStartX);
if (offsetX > 30) {
Log.e("TEST", "Òƶ¯Æ«ÒÆ" + offsetX);
mOffsetX = (int) (mStartX - ev.getX());
mLayoutTitleMovable.scrollTo(mOffsetX, 0);
for (int i = 0; i < mArrayList.size(); i++) {


mArrayList.get(i).scrollTo(mOffsetX, 0);
}
Log.e("TEST", "ListÊýÁ¿" + mArrayList.size());
// mLayoutMovable.scrollTo(mOffsetX, 0);
}
break;
case MotionEvent.ACTION_UP:
Log.e("TEST", "Òƶ¯Ì§Æðx= " + ev.getX());
fixX = (int) ((int) ev.getX() - mStartX);
actionUP();
break;


default:
break;
}


return super.onTouchEvent(ev);
}


/**
* Ž¥Ãþ̧Æð
*/
private void actionUP() {
if (fixX > 0) {
mLayoutTitleMovable.scrollTo(0, 0);
for (int i = 0; i < mArrayList.size(); i++) {
mArrayList.get(i).scrollTo(0, 0);
}
// mLayoutMovable.scrollTo(0, 0);
} else {
if ((mLayoutTitleMovable.getWidth() + Math.abs(fixX)) > mTitleWidth
* mTitleMovableStr.length) {
mLayoutTitleMovable.scrollTo(mTitleWidth
* mTitleMovableStr.length-mLayoutTitleMovable.getWidth(), 0);
for (int i = 0; i < mArrayList.size(); i++) {
mArrayList.get(i).scrollTo(mTitleWidth
* mTitleMovableStr.length-mLayoutTitleMovable.getWidth(), 0);
}
// mLayoutMovable.scrollTo(0, 0);
}


}
}


/**
* ÉèÖÿɱäµÄÁбíÍ·ÐÅÏ¢
*
* @param str
* ÁбíÍ·ÏÔÊŸµÄÃû³Æ
*/
public void setMovableHead(String[] str) {
mTitleMovableStr = str;
}


/**
* ÉèÖò»¿É±äµÄÁбíÍ·ÐÅÏ¢
*
* @param str
* ÁбíÍ·ÏÔÊŸµÄÃû³Æ
* @param height
* ÁбíÍ·µÄžß¶È
* @param width
* ÁбíÍ·µÄ¿í¶È
*/
public void setFixHead(String[] str, int height, int width) {
mTitleHeight = height;
mTitleWidth = width;
mTitleFixStr = str;
}

public View getHeaderLayout(){
return mLayoutHeader;
}


/**
* ÉèÖÃListView ÊÊÅäÆ÷
*
* @param adapter
*/
public void setScrollListViewAdapter(
BaseAdapter movableAdapter) {
// listViewFix.setAdapter(fixAdapter);
listViewMovable.setAdapter(movableAdapter);

}
/**
* ¿É×óÓÒ»¬¶¯ViewŒ¯ºÏ
* @param movableView
*/
public void setMovabaleView(ArrayList<View> movableView) {
mArrayList = movableView;
}

/**
* listView µã»÷
* @param onItemClickedListener
*/
public void setOnItemClickedListener(
OnItemClickListener onItemClickListener) {

listViewMovable.setOnItemClickListener(onItemClickListener);
}
/**
* ÁÐÍ·µã»÷ÊÂŒþ
* @param onHeaderClickedListener
*/
public void setOnHeaderClickedListener(
OnHeaderClickedListener onHeaderClickedListener) {
// onHeaderClickedListener.
// mLayoutHeader.getChildAt(0).setOnClickListener(l);
}


/**
* ÁÐÍ·µã»÷ÊÂŒþ
*
* @createTime 2011-9-26
* @company ÉîÛÚÊÐŽŽÕæ¿ÆŒŒ
* @author niuxuehao
*/
public static interface OnHeaderClickedListener {
public void onClick(int headerID, int direction);


}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值