Android ListView左右滑动接受拒绝

标签 android listview swipe

我想开发一个 ListView ,当从左向右滑动时 - 在左角显示一个接受 (true) 图标(不可点击 - 从左向右滑动时仅显示颜色变化),如下图所示:

enter image description here

当我从左向右滑动时,它会接受(调用“接受”API), 当我从右向左滑动时,它会显示如下内容:

enter image description here

这是在 iOS 中完成的,但我找不到如何在 Android 中执行此操作,我尝试谷歌搜索但找不到我想要的东西。

我尝试了以下示例:http://www.tutecentral.com/android-swipe-listview/

但在该示例中,当我从左向右和从右向左滑动时,会调用相同的 onOpened(..) 方法,因此很难知道何时调用 accept 以及何时调用 reject API,因为调用了相同的方法在任何类型的滑动上。

而且我还希望接受(在左侧)和拒绝(在右侧)图像仅在我向左向右或向右向左滑动时显示,但是当我抬起手指时它们必须消失并且整个 ListView应显示(切勿同时显示两侧图像)。

所以任何人都请帮助我了解如何做到这一点。

我的问题有点令人困惑,但我不知道如何解释整个动画,所以我试着像上面那样解释。

如果有人能帮助我,我将不胜感激。

最佳答案

解决方案编号 1:

您必须执行以下操作才能“接近”您的功能,

包装您的 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/

我已经从链接 http://www.tutecentral.com/android-swipe-listview/ 中尝试了您的代码并更改一些代码并成功解决您关于 onOpened(..) 方法(从左到右调用,反之亦然)的问题(您的困惑)

第一个变化:

  1. custom_row.xml 布局文件有三个按钮 swipe_button1 到 3 , 删除它们的中间部分。

  2. 复制粘贴以下代码以保留两个按钮:

    <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 当我抬起手指时,它必须显示整个 ListView ,或者 ListView 的边应该保留它的角,这样它就不起作用了

->上面已经回答过了

调用 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;
  }

 }

其他代码和库保持不变,对你和其他人都有帮助,所以享受。

关于Android ListView左右滑动接受拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30908068/

相关文章:

android - 安卓打开网站需要设置上网权限吗?

抛出 RuntimeException 的 Java 函数

java - 具有多个文本和图像的 ListView

android - 如何使用 Drawable 图像名称从 ArrayList<String> 动态设置 ImageViews 源?

ios iphone删除按钮(滑动删除)弄乱了uitableview内容

android - Android PhoneGap 中的自定义字体

java - Android 更改 float 操作按钮颜色

android - 警报对话框中带有复选框的 ListView

objective-c - 如何使用quickdialog实现滑动删除

ios - 如何在 SwiftUI 中禁用 iOS 可达性滑动手势