Android ListView 向右和向左滑动以接受和拒绝
Android ListView Swipe Right and Left to Accept and Reject
我想开发一个列表视图,当从左向右滑动时 - 在左角显示一个接受(真实)图标(不可点击 - 从左向右滑动时仅显示颜色变化),如下图所示射击:
当我从左向右滑动时它会接受(调用 'accept' API),
当我从右向左滑动时,它会显示如下内容:
这是在 iOS 中完成的,但我在 Android 中找不到如何执行此操作,我尝试使用谷歌搜索但找不到我想要的内容。
我尝试了以下示例:http://www.tutecentral.com/android-swipe-listview/
但在那个例子中,当我从左向右和从右向左滑动时,相同的 onOpened(..) 方法被调用,所以不知道什么时候调用 accept 什么时候调用 reject API因为在任何类型的滑动上都会调用相同的方法。
而且我还希望接受(左侧)和拒绝(右侧)图像仅在我向左向右或向右向左滑动时显示,但是当我抬起手指时它们必须消失并且应显示整个 ListView(切勿同时显示两侧图像)。
所以任何人都请帮助我了解如何做到这一点。
我的问题有点混乱,但我不知道如何解释整个动画,所以我试着像上面那样解释。
如果有人能帮助我,将不胜感激。
看看 this 库,它将为您提供很好的示例并为您指明正确的方向。祝你好运。
解决方案编号 1 :
您必须执行以下操作才能达到 "near" 您的功能,
包装您的 ListView 的适配器
喜欢以下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create an Adapter for your content
String[] content = new String[20];
for (int i=0;i<20;i++) content[i] = "Row "+(i+1);
ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>(
this,
R.layout.row_bg,
R.id.text,
new ArrayList<String>(Arrays.asList(content))
);
// Wrap your content in a SwipeActionAdapter
mAdapter = new SwipeActionAdapter(stringAdapter);
// Pass a reference of your ListView to the SwipeActionAdapter
mAdapter.setListView(getListView());
// Set the SwipeActionAdapter as the Adapter for your ListView
setListAdapter(mAdapter);
}
为每个滑动方向创建背景布局
喜欢以下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create an Adapter for your content
String[] content = new String[20];
for (int i=0;i<20;i++) content[i] = "Row "+(i+1);
ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>(
this,
R.layout.row_bg,
R.id.text,
new ArrayList<String>(Arrays.asList(content))
);
// Wrap your content in a SwipeActionAdapter
mAdapter = new SwipeActionAdapter(stringAdapter);
// Pass a reference of your ListView to the SwipeActionAdapter
mAdapter.setListView(getListView());
// Set the SwipeActionAdapter as the Adapter for your ListView
setListAdapter(mAdapter);
// Set backgrounds for the swipe directions
mAdapter.addBackground(SwipeDirections.DIRECTION_FAR_LEFT,R.layout.row_bg_left_far)
.addBackground(SwipeDirections.DIRECTION_NORMAL_LEFT,R.layout.row_bg_left)
.addBackground(SwipeDirections.DIRECTION_FAR_RIGHT,R.layout.row_bg_right_far)
.addBackground(SwipeDirections.DIRECTION_NORMAL_RIGHT,R.layout.row_bg_right);
}
您从这里获得了库和示例:
https://github.com/wdullaer/SwipeActionAdapter
这不会完全像您想要的那样,但我希望这对您实现功能有很大帮助。
解决方案编号 2 :
解决方案 2 是关于更改您使用的代码中的一些代码:http://www.tutecentral.com/android-swipe-listview/
我已经尝试了 link http://www.tutecentral.com/android-swipe-listview/ 中的代码并更改了一些代码并成功解决了关于 onOpened(..) 方法(从左到右调用,反之亦然)的问题(你的困惑) )
第一个变化:
custom_row.xml 布局文件有三个按钮 swipe_button1 到 3 ,
删除中间部分。
复制粘贴以下代码以保留两个按钮:
<Button
android:id="@+id/swipe_button1"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/your_accept_image" />
<Button
android:id="@+id/swipe_button3"
style="@style/MyListButtonAction"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/your_reject_image" />
此布局的代码保持不变。
第二个变化:
现在您的接受和拒绝以及列表代码已准备就绪,现在讨论 onOpened(..) 方法。
混淆解决方案 1- 你告诉过,你的 onOpend(...) 方法从左到右和反之亦然
-> 仅更改以下内容:
public void onOpened(int position, boolean toRight) {
if(toRight)
{
// for left to right your api calling here
swipelistview.closeAnimate(position);
}
else
{
// for right to left your api calling here
swipelistview.closeAnimate(position);
}
}
混淆解决方案 2 当我抬起手指时,它必须显示整个列表视图,或者列表视图的边应该保留它的角,这样它就不起作用了
-> 我已经在上面回答过了
调用了swipelistview.closeAnimate(position);在这两个if else中,当你左右滑动时它会隐藏左接受和右拒绝图像。
所以最终代码如下:
整个cutom_row.xml布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:id="@+id/back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="back" >
<Button
android:id="@+id/swipe_button1"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/accept_image" />
<Button
android:id="@+id/swipe_button3"
style="@style/MyListButtonAction"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/reject_image" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/front"
style="@style/MyListFrontContent"
android:orientation="vertical"
android:tag="front" >
<ImageView
android:id="@+id/example_image"
style="@style/MyListImage" />
<TextView
android:id="@+id/example_itemname"
style="@style/MyListTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/example_image" />
</RelativeLayout>
</FrameLayout>
整个MainActivity.java
public class MainActivity extends Activity {
SwipeListView swipelistview;
ItemAdapter adapter;
List<ItemRow> itemData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
swipelistview=(SwipeListView)findViewById(R.id.example_swipe_lv_list);
itemData=new ArrayList<ItemRow>();
adapter=new ItemAdapter(this,R.layout.custom_row,itemData);
swipelistview.setSwipeListViewListener(new BaseSwipeListViewListener() {
@Override
public void onOpened(int position, boolean toRight) {
if(toRight)
{
// for left to right your api calling here
swipelistview.closeAnimate(position);
}
else
{
// for right to left your api calling here
swipelistview.closeAnimate(position);
}
}
@Override
public void onClosed(int position, boolean fromRight) {
// close list slide
}
@Override
public void onListChanged() {
}
@Override
public void onMove(int position, float x) {
}
@Override
public void onStartOpen(int position, int action, boolean right) {
Log.d("swipe", String.format("onStartOpen %d - action %d", position, action));
}
@Override
public void onStartClose(int position, boolean right) {
Log.d("swipe", String.format("onStartClose %d", position));
}
@Override
public void onClickFrontView(int position) {
Log.d("swipe", String.format("onClickFrontView %d", position));
}
@Override
public void onClickBackView(int position) {
Log.d("swipe", String.format("onClickBackView %d", position));
swipelistview.closeAnimate(position);//when you touch back view it will close
}
@Override
public void onDismiss(int[] reverseSortedPositions) {
}
});
//These are the swipe listview settings. you can change these
//setting as your requirement
swipelistview.setSwipeMode(SwipeListView.SWIPE_MODE_BOTH); // there are five swiping modes
// swipelistview.setSwipeActionLeft(SwipeListView.SWIPE_ACTION_DISMISS); //there are four swipe actions
swipelistview.setSwipeActionRight(SwipeListView.SWIPE_ACTION_REVEAL);
swipelistview.setOffsetLeft(convertDpToPixel(0f)); // left side offset
swipelistview.setOffsetRight(convertDpToPixel(80f)); // right side offset
swipelistview.setAnimationTime(500); // Animation time
swipelistview.setSwipeOpenOnLongPress(true); // enable or disable SwipeOpenOnLongPress
swipelistview.setAdapter(adapter);
for(int i=0;i<10;i++)
{
itemData.add(new ItemRow("Swipe Item"+ i,getResources().getDrawable(R.drawable.ic_launcher) ));
}
adapter.notifyDataSetChanged();
}
public int convertDpToPixel(float dp) {
DisplayMetrics metrics = getResources().getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return (int) px;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
其他代码和库保持不变,对你和其他人都有帮助,所以享受。
它对我有用......我希望它对你有用......!
将 OnTouchListener 设置为列表视图
listview.setOnTouchListener(new OnSwipeTouchListener(getActivity(),
listview));
OnSwipeTouchListenerclass如下:
public class OnSwipeTouchListener implements OnTouchListener {
ListView list;
private GestureDetector gestureDetector;
private Context context;
public OnSwipeTouchListener(Context ctx, ListView list) {
gestureDetector = new GestureDetector(ctx, new GestureListener());
context = ctx;
this.list = list;
}
public OnSwipeTouchListener() {
super();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
public void onSwipeRight(int pos) {
//Do what you want after swiping left to right
}
public void onSwipeLeft(int pos) {
//Do what you want after swiping right to left
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
private int getPostion(MotionEvent e1) {
return list.pointToPosition((int) e1.getX(), (int) e1.getY());
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY)
&& Math.abs(distanceX) > SWIPE_THRESHOLD
&& Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight(getPostion(e1));
else
onSwipeLeft(getPostion(e1));
return true;
}
return false;
}
}
}
请避免使用上述方法,否则您将用视图逻辑完全填充控制器(这是您必须避免的事情)访问 https://github.com/xenione/SwipeLayout 有一个带有一些示例的刷卡器
基于@Pratibha Sarode 解决方案,我按照以下方式对其进行了调整,其中包含一个包含游标适配器和数据库的列表视图:
主要 activity :
//-- Attach cursor adapter to the ListView
lvItems.setAdapter(todoAdapter);
/////////////////// Swipe Management
lvItems.setOnTouchListener(new OnSwipeList(AfficList.this,lvItems){
public void onSwipeRight(int pos) {
AnnonceDbHandler dbHandler = new AnnonceDbHandler(AfficList.this, null, null, 1);
String sIdAnn=dbHandler.RechercheIdIndex(pos);
//Toast.makeText(AfficList.this, "Right ("+pos+") : "+sIdAnn, Toast.LENGTH_SHORT).show();
dbHandler.deleteAnnonce(sIdAnn, AfficList.this);
Cursor NewCursor = dbAnnonces.rawQuery("SELECT * FROM annonces", null);
todoAdapter.swapCursor(NewCursor);
lvItems.setAdapter(todoAdapter);
todoAdapter.notifyDataSetChanged();
}
public void onSwipeLeft(int pos) {
AnnonceDbHandler dbHandler = new AnnonceDbHandler(AfficList.this, null, null, 1);
String sIdAnn=dbHandler.RechercheIdIndex(pos);
//Toast.makeText(AfficList.this, "Right ("+pos+") : "+sIdAnn, Toast.LENGTH_SHORT).show();
dbHandler.deleteAnnonce(sIdAnn, AfficList.this);
Cursor NewCursor = dbAnnonces.rawQuery("SELECT * FROM annonces", null);
todoAdapter.swapCursor(NewCursor);
lvItems.setAdapter(todoAdapter);
todoAdapter.notifyDataSetChanged();
}
});
通过滑动移动删除线条效果很好!
使用 处的答案,我做到了。
View.OnTouchListener swipeListener = new View.OnTouchListener() {
private float dx;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dx = v.getX() - event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
// You can limit x-coordinate.
float x = Math.min(event.getRawX() + dx, 0);
// x = Math.max(x, ((View) v.getParent()).getWidth() - v.getWidth()); // Scroll if layout is wider than screen.
v.animate()
.x(x)
.setDuration(0)
.start();
break;
default:
return false;
}
return true;
}
};
在您的适配器的 getView
中写入:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_layout, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Fill data.
final Item item = items.get(position);
viewHolder.caption.setText(item.getCaption());
// Set onTouch listener.
convertView.setOnTouchListener(swipeListener);
return convertView;
}
我认为在 item_layout.xml 中使用 HorizontalScrollView 也可以实现同样的效果。
在Java中这样:
1- 在您的 activity
中添加此 class
2-定义左右移动两个函数
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1 == null || e2 == null)
return false;
if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH)
return false;
if (e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
onRTLFling(e1);
} else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
onLTRFling(e1);
}
return false;
}
}
我想开发一个列表视图,当从左向右滑动时 - 在左角显示一个接受(真实)图标(不可点击 - 从左向右滑动时仅显示颜色变化),如下图所示射击:
当我从左向右滑动时它会接受(调用 'accept' API), 当我从右向左滑动时,它会显示如下内容:
这是在 iOS 中完成的,但我在 Android 中找不到如何执行此操作,我尝试使用谷歌搜索但找不到我想要的内容。
我尝试了以下示例:http://www.tutecentral.com/android-swipe-listview/
但在那个例子中,当我从左向右和从右向左滑动时,相同的 onOpened(..) 方法被调用,所以不知道什么时候调用 accept 什么时候调用 reject API因为在任何类型的滑动上都会调用相同的方法。
而且我还希望接受(左侧)和拒绝(右侧)图像仅在我向左向右或向右向左滑动时显示,但是当我抬起手指时它们必须消失并且应显示整个 ListView(切勿同时显示两侧图像)。
所以任何人都请帮助我了解如何做到这一点。
我的问题有点混乱,但我不知道如何解释整个动画,所以我试着像上面那样解释。
如果有人能帮助我,将不胜感激。
看看 this 库,它将为您提供很好的示例并为您指明正确的方向。祝你好运。
解决方案编号 1 :
您必须执行以下操作才能达到 "near" 您的功能,
包装您的 ListView 的适配器
喜欢以下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create an Adapter for your content
String[] content = new String[20];
for (int i=0;i<20;i++) content[i] = "Row "+(i+1);
ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>(
this,
R.layout.row_bg,
R.id.text,
new ArrayList<String>(Arrays.asList(content))
);
// Wrap your content in a SwipeActionAdapter
mAdapter = new SwipeActionAdapter(stringAdapter);
// Pass a reference of your ListView to the SwipeActionAdapter
mAdapter.setListView(getListView());
// Set the SwipeActionAdapter as the Adapter for your ListView
setListAdapter(mAdapter);
}
为每个滑动方向创建背景布局
喜欢以下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create an Adapter for your content
String[] content = new String[20];
for (int i=0;i<20;i++) content[i] = "Row "+(i+1);
ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>(
this,
R.layout.row_bg,
R.id.text,
new ArrayList<String>(Arrays.asList(content))
);
// Wrap your content in a SwipeActionAdapter
mAdapter = new SwipeActionAdapter(stringAdapter);
// Pass a reference of your ListView to the SwipeActionAdapter
mAdapter.setListView(getListView());
// Set the SwipeActionAdapter as the Adapter for your ListView
setListAdapter(mAdapter);
// Set backgrounds for the swipe directions
mAdapter.addBackground(SwipeDirections.DIRECTION_FAR_LEFT,R.layout.row_bg_left_far)
.addBackground(SwipeDirections.DIRECTION_NORMAL_LEFT,R.layout.row_bg_left)
.addBackground(SwipeDirections.DIRECTION_FAR_RIGHT,R.layout.row_bg_right_far)
.addBackground(SwipeDirections.DIRECTION_NORMAL_RIGHT,R.layout.row_bg_right);
}
您从这里获得了库和示例: https://github.com/wdullaer/SwipeActionAdapter
这不会完全像您想要的那样,但我希望这对您实现功能有很大帮助。
解决方案编号 2 :
解决方案 2 是关于更改您使用的代码中的一些代码:http://www.tutecentral.com/android-swipe-listview/
我已经尝试了 link http://www.tutecentral.com/android-swipe-listview/ 中的代码并更改了一些代码并成功解决了关于 onOpened(..) 方法(从左到右调用,反之亦然)的问题(你的困惑) )
第一个变化:
custom_row.xml 布局文件有三个按钮 swipe_button1 到 3 , 删除中间部分。
复制粘贴以下代码以保留两个按钮:
<Button android:id="@+id/swipe_button1" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="@drawable/your_accept_image" /> <Button android:id="@+id/swipe_button3" style="@style/MyListButtonAction" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/your_reject_image" />
此布局的代码保持不变。
第二个变化:
现在您的接受和拒绝以及列表代码已准备就绪,现在讨论 onOpened(..) 方法。
混淆解决方案 1- 你告诉过,你的 onOpend(...) 方法从左到右和反之亦然
-> 仅更改以下内容:
public void onOpened(int position, boolean toRight) {
if(toRight)
{
// for left to right your api calling here
swipelistview.closeAnimate(position);
}
else
{
// for right to left your api calling here
swipelistview.closeAnimate(position);
}
}
混淆解决方案 2 当我抬起手指时,它必须显示整个列表视图,或者列表视图的边应该保留它的角,这样它就不起作用了
-> 我已经在上面回答过了
调用了swipelistview.closeAnimate(position);在这两个if else中,当你左右滑动时它会隐藏左接受和右拒绝图像。
所以最终代码如下:
整个cutom_row.xml布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:id="@+id/back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="back" >
<Button
android:id="@+id/swipe_button1"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/accept_image" />
<Button
android:id="@+id/swipe_button3"
style="@style/MyListButtonAction"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/reject_image" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/front"
style="@style/MyListFrontContent"
android:orientation="vertical"
android:tag="front" >
<ImageView
android:id="@+id/example_image"
style="@style/MyListImage" />
<TextView
android:id="@+id/example_itemname"
style="@style/MyListTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/example_image" />
</RelativeLayout>
</FrameLayout>
整个MainActivity.java
public class MainActivity extends Activity {
SwipeListView swipelistview;
ItemAdapter adapter;
List<ItemRow> itemData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
swipelistview=(SwipeListView)findViewById(R.id.example_swipe_lv_list);
itemData=new ArrayList<ItemRow>();
adapter=new ItemAdapter(this,R.layout.custom_row,itemData);
swipelistview.setSwipeListViewListener(new BaseSwipeListViewListener() {
@Override
public void onOpened(int position, boolean toRight) {
if(toRight)
{
// for left to right your api calling here
swipelistview.closeAnimate(position);
}
else
{
// for right to left your api calling here
swipelistview.closeAnimate(position);
}
}
@Override
public void onClosed(int position, boolean fromRight) {
// close list slide
}
@Override
public void onListChanged() {
}
@Override
public void onMove(int position, float x) {
}
@Override
public void onStartOpen(int position, int action, boolean right) {
Log.d("swipe", String.format("onStartOpen %d - action %d", position, action));
}
@Override
public void onStartClose(int position, boolean right) {
Log.d("swipe", String.format("onStartClose %d", position));
}
@Override
public void onClickFrontView(int position) {
Log.d("swipe", String.format("onClickFrontView %d", position));
}
@Override
public void onClickBackView(int position) {
Log.d("swipe", String.format("onClickBackView %d", position));
swipelistview.closeAnimate(position);//when you touch back view it will close
}
@Override
public void onDismiss(int[] reverseSortedPositions) {
}
});
//These are the swipe listview settings. you can change these
//setting as your requirement
swipelistview.setSwipeMode(SwipeListView.SWIPE_MODE_BOTH); // there are five swiping modes
// swipelistview.setSwipeActionLeft(SwipeListView.SWIPE_ACTION_DISMISS); //there are four swipe actions
swipelistview.setSwipeActionRight(SwipeListView.SWIPE_ACTION_REVEAL);
swipelistview.setOffsetLeft(convertDpToPixel(0f)); // left side offset
swipelistview.setOffsetRight(convertDpToPixel(80f)); // right side offset
swipelistview.setAnimationTime(500); // Animation time
swipelistview.setSwipeOpenOnLongPress(true); // enable or disable SwipeOpenOnLongPress
swipelistview.setAdapter(adapter);
for(int i=0;i<10;i++)
{
itemData.add(new ItemRow("Swipe Item"+ i,getResources().getDrawable(R.drawable.ic_launcher) ));
}
adapter.notifyDataSetChanged();
}
public int convertDpToPixel(float dp) {
DisplayMetrics metrics = getResources().getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return (int) px;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
其他代码和库保持不变,对你和其他人都有帮助,所以享受。
它对我有用......我希望它对你有用......!
将 OnTouchListener 设置为列表视图
listview.setOnTouchListener(new OnSwipeTouchListener(getActivity(),
listview));
OnSwipeTouchListenerclass如下:
public class OnSwipeTouchListener implements OnTouchListener {
ListView list;
private GestureDetector gestureDetector;
private Context context;
public OnSwipeTouchListener(Context ctx, ListView list) {
gestureDetector = new GestureDetector(ctx, new GestureListener());
context = ctx;
this.list = list;
}
public OnSwipeTouchListener() {
super();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
public void onSwipeRight(int pos) {
//Do what you want after swiping left to right
}
public void onSwipeLeft(int pos) {
//Do what you want after swiping right to left
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
private int getPostion(MotionEvent e1) {
return list.pointToPosition((int) e1.getX(), (int) e1.getY());
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY)
&& Math.abs(distanceX) > SWIPE_THRESHOLD
&& Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight(getPostion(e1));
else
onSwipeLeft(getPostion(e1));
return true;
}
return false;
}
}
}
请避免使用上述方法,否则您将用视图逻辑完全填充控制器(这是您必须避免的事情)访问 https://github.com/xenione/SwipeLayout 有一个带有一些示例的刷卡器
基于@Pratibha Sarode 解决方案,我按照以下方式对其进行了调整,其中包含一个包含游标适配器和数据库的列表视图: 主要 activity :
//-- Attach cursor adapter to the ListView
lvItems.setAdapter(todoAdapter);
/////////////////// Swipe Management
lvItems.setOnTouchListener(new OnSwipeList(AfficList.this,lvItems){
public void onSwipeRight(int pos) {
AnnonceDbHandler dbHandler = new AnnonceDbHandler(AfficList.this, null, null, 1);
String sIdAnn=dbHandler.RechercheIdIndex(pos);
//Toast.makeText(AfficList.this, "Right ("+pos+") : "+sIdAnn, Toast.LENGTH_SHORT).show();
dbHandler.deleteAnnonce(sIdAnn, AfficList.this);
Cursor NewCursor = dbAnnonces.rawQuery("SELECT * FROM annonces", null);
todoAdapter.swapCursor(NewCursor);
lvItems.setAdapter(todoAdapter);
todoAdapter.notifyDataSetChanged();
}
public void onSwipeLeft(int pos) {
AnnonceDbHandler dbHandler = new AnnonceDbHandler(AfficList.this, null, null, 1);
String sIdAnn=dbHandler.RechercheIdIndex(pos);
//Toast.makeText(AfficList.this, "Right ("+pos+") : "+sIdAnn, Toast.LENGTH_SHORT).show();
dbHandler.deleteAnnonce(sIdAnn, AfficList.this);
Cursor NewCursor = dbAnnonces.rawQuery("SELECT * FROM annonces", null);
todoAdapter.swapCursor(NewCursor);
lvItems.setAdapter(todoAdapter);
todoAdapter.notifyDataSetChanged();
}
});
通过滑动移动删除线条效果很好!
使用 处的答案,我做到了。
View.OnTouchListener swipeListener = new View.OnTouchListener() {
private float dx;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dx = v.getX() - event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
// You can limit x-coordinate.
float x = Math.min(event.getRawX() + dx, 0);
// x = Math.max(x, ((View) v.getParent()).getWidth() - v.getWidth()); // Scroll if layout is wider than screen.
v.animate()
.x(x)
.setDuration(0)
.start();
break;
default:
return false;
}
return true;
}
};
在您的适配器的 getView
中写入:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_layout, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Fill data.
final Item item = items.get(position);
viewHolder.caption.setText(item.getCaption());
// Set onTouch listener.
convertView.setOnTouchListener(swipeListener);
return convertView;
}
我认为在 item_layout.xml 中使用 HorizontalScrollView 也可以实现同样的效果。
在Java中这样:
1- 在您的 activity
中添加此 class2-定义左右移动两个函数
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1 == null || e2 == null)
return false;
if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH)
return false;
if (e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
onRTLFling(e1);
} else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
onLTRFling(e1);
}
return false;
}
}