1.布局文件
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1323" />
<Button
android:id="@+id/bt_del"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</HorizontalScrollView>
-------------------------------------------------------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<com.example.scroll.myListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.example.scroll.myListView>
</RelativeLayout>
2.代码
a
package com.example.scroll;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ArrayList<String> al = new ArrayList<String>();
private myListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
initData();
myAdapter myadapter = new myAdapter(getApplicationContext(), al);
lv.setAdapter(myadapter);
}
/**
* 初始化显示数据
*/
private void initData() {
al.add("23r1");
al.add("2r13");
al.add("ewf");
al.add("asv");
al.add("sav");
al.add("xzc ");
al.add("qwf");
al.add("3rg");
al.add("ve");
al.add("dsa");
al.add("vf");
al.add("gbr");
al.add("wv");
}
/**
* 初始化控件
*/
private void initUI() {
lv = (myListView) findViewById(R.id.lv);
}
}
b
package com.example.scroll;
import java.util.ArrayList;
import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class myAdapter extends BaseAdapter {
private Context mc;
private int width;
public HorizontalScrollView mView;
public boolean lockView = false;
private ArrayList<String> al = new ArrayList<String>();
public myAdapter(Context mc, ArrayList<String> al) {
//得到屏幕宽度
WindowManager wm = (WindowManager) mc
.getSystemService(mc.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
this.mc = mc;
this.al = al;
}
private class myTouchListener implements OnTouchListener {
private int startX;
private int startY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
// 为了平移方便,把view强转
final HorizontalScrollView view = (HorizontalScrollView) v;
// 抬手位置
int endX = (int) event.getX();
int endY = (int) event.getY();
// 如果向左划
if (Math.abs(startY - endY) < 100 && startX - endX > 50) {
// 1.view设置移动效果
scrollTo(view, HorizontalScrollView.FOCUS_RIGHT);
mView = view;
Log.d("移动", "左移");
} else {
scrollTo(view, HorizontalScrollView.FOCUS_LEFT);
}
break;
case MotionEvent.ACTION_DOWN:
//如果手指按下并且有的侧滑没关闭,就关闭
if (mView != null) {
scrollTo(mView, HorizontalScrollView.FOCUS_LEFT);
lockView = true;
mView = null;
return true;
}
// 手指按下后就会记录位置
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
break;
default:
break;
}
return false;
}
}
public void scrollTo(final HorizontalScrollView view, final int way) {
view.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 2.使用HorizontalScrollView特有函数进行平移一个页面,把button隐藏
view.pageScroll(way);
}
});
}
private class viewHolder {
public TextView tv;
public Button bt;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
viewHolder vh = new viewHolder();
convertView = (HorizontalScrollView) View.inflate(mc,
R.layout.horizontalscrollview, null);
// 设置滑动事件,设置后就能滑动了
convertView.setOnTouchListener(new myTouchListener());
vh.tv = (TextView) convertView.findViewById(R.id.tv_text);
// 设置textview的宽度,把button挤出屏幕
vh.tv.setLayoutParams(new LinearLayout.LayoutParams(width,
LinearLayout.LayoutParams.MATCH_PARENT));
// 常规操作
vh.bt = (Button) convertView.findViewById(R.id.bt_del);
vh.bt.setText("删除");
convertView.setTag(vh);
}
// 常规操作
viewHolder vh = (viewHolder) convertView.getTag();
String str = al.get(position);
vh.tv.setText(str);
return convertView;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return al.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return al.size();
}
}
c
package com.example.scroll;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.HorizontalScrollView;
import android.widget.ListAdapter;
import android.widget.ListView;
public class myListView extends ListView {
private myAdapter md;
public myListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/*
* 拦截手指触摸
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (md.lockView) {
if (ev.getAction() == MotionEvent.ACTION_DOWN
|| ev.getAction() == MotionEvent.ACTION_MOVE) {
// 让滑动出删除按钮的那个itemView退回去
if (md.mView != null) {
md.scrollTo(md.mView, HorizontalScrollView.FOCUS_LEFT);
md.mView = null;
}
return true;
}
if (ev.getAction() == MotionEvent.ACTION_UP) {
md.lockView = false;
}
}
return super.dispatchTouchEvent(ev);
}
@Override
public void setAdapter(ListAdapter adapter) {
md = (myAdapter) adapter;
super.setAdapter(adapter);
}
}
1.要想实现侧滑,就要把需要滑动的控件用HorizontalScrollView包裹起来,再设置android:scrollbars="none",不让控件有滑动条