Android ListView 左右滑动接受和拒绝 [英] Android ListView Swipe Right and Left to Accept and Reject

查看:19
本文介绍了Android ListView 左右滑动接受和拒绝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想开发一个列表视图,当从左向右滑动时 - 在左角显示一个接受(真)图标(不可点击 - 从左向右滑动时仅显示颜色变化),如下面的屏幕截图:

I want to develop a list view that when swiped left to right - displays in the left corner an accept (true) icon (non clickable - show just a color change when swiping left to right), like the following screen shot:

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

When I swipe from left to right it will accept (calling 'accept' API), and when I swipe right to left it will display something like this:

这是在 iOS 中完成的,但我无法在 Android 中找到如何执行此操作,我尝试使用谷歌搜索但无法准确找到我想要的内容.

This is done in iOS, but I can't find how to do this in Android, I tried googling but couldn't find exactly what I want.

我尝试了以下示例:http://www.tutecentral.com/android-滑动列表视图/

但在那个例子中,当我从左向右和从右向左滑动时,会调用相同的 onOpened(..) 方法,因此知道何时调用 accept 和何时调用拒绝 API 会令人困惑,因为调用了相同的方法任何类型的滑动.

but in that example, when I swipe left to right and right to left, the same onOpened(..) method is called so it's confusing to know when to call accept and when to call reject API because the same method is called on any type of swipe.

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

and I also want the accept (on left side) and reject (on right side) images to display only when I swipe left-right or right-left, but when I take the finger up they must disappear and the entire ListView should be displayed (never show both side images at the same time).

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

So any one please help me to understand how to do this.

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

My question is somewhat confusing but I don't know how to explain the entire animation so I tried to explain like the above.

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

If any one can help me it would be very appreciated.

推荐答案

解决方案一:

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

You Have to do like following to reach "near" to your functionality,

包裹你的 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

You got both libraries and Example from the here : https://github.com/wdullaer/SwipeActionAdapter

这不会完全像您想要的那样,但我希望这对您实现功能有很大帮助.

This will not exact like you want, but i hope this will help you so much to fulfilled your functionality.

解决方案 2 :

解决方案 2 是关于更改您使用的代码中的一些代码:http://www.tutecentral.com/android-swipe-listview/

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

i had try your code from the link http://www.tutecentral.com/android-swipe-listview/ and changing some code and successfully solve your problem(your confusion) about onOpened(..) method ( called left to right and vice versa )

第一个变化:

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

  1. custom_row.xml layout file has three button swipe_button1 to 3 , remove middle of them.

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

Copy paste following code for remain two button :

<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" />

此布局的代码保持不变.

Remains code same for this layout.

第二个变化:

现在你的接受和拒绝和列表代码已经准备好了,现在讨论 onOpened(..) 方法.

So now your accept and reject and list code is ready , now discuss about onOpened(..) method.

混淆解决方案 1- 你告诉过,你的 onOpend(...) 方法从左到右调用相同,反之亦然

Confusion solution 1- You told , your onOpend(...) method called same both left to right and vice-verse

-> 只是更改以下内容:

-> just to change following :

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 当我抬起手指时,它必须显示整个列表视图,或者列表视图的边应该保留它的角,所以它不起作用

Confusion solution 2 when i take finger up it will must display entire listview or listview sides should retain it corners so its not working

->我已经在上面回答了

-> i already answered it in above

调用 swipelistview.closeAnimate(position); 在这两个 if else 中,当您向左和向右滑动时,它会隐藏左接受和右拒绝图像.

called swipelistview.closeAnimate(position); in both if else, it hide left accept and right reject image when your your swipe left and right over.

所以最终代码如下:

整个 cutom_row.xml 布局

Entire cutom_row.xml layout

 <?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

Entire 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;
  }

 }

其他代码和库保持不变,对您和其他人也有帮助,请尽情享受.

Other code and library remains same, It helpful to you and other also, So enjoy.

这篇关于Android ListView 左右滑动接受和拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆