Android ListView Проведите пальцем вправо и влево, чтобы принять и отклонить

Я хочу создать представление списка, в котором я хочу, когда я прокручиваю влево вправо, в левом углу отображается один признак (истинный) значок (не кликабельно – показывать только изменение цвета при прокрутке влево-вправо), например, следующий снимок экрана,

Введите описание изображения здесь

Когда я промахиваю все слева направо, он принимает (в том, что я назвал accept api), и когда я прокручиваю направо налево, он будет отображаться следующим образом:

Введите описание изображения здесь

Это сделано в iphone, но я точно не знаю, как это сделать в android, я так много googling, но не нашел именно то, что я хочу,

Я пробую следующий пример: http://www.tutecentral.com/android-swipe-listview/

Но в том, что когда я прокручиваю влево и направо и направо налево, то метод onOpened (..) вызывается так, что это сбивает с толку: когда вызывать accept и отклонять api, потому что тот же метод вызывается при любом типе салфетки.

И я также хочу, когда я просто прокручиваю влево-вправо или вправо-влево только в тот момент, когда вы принимаете изображение (левая сторона) и отклоняете (отклоняете изображение справа), когда я беру палец вверх, он должен отображать весь список (не обе стороны изображения ).

Поэтому, пожалуйста, помогите мне, как это сделать.

Мой вопрос несколько запутанный, а также с некоторой низкой грамматикой, но я знаю, как объяснить всю анимацию, поэтому я стараюсь писать, как указано выше,

Если кто-то мне помогает, это очень ценится.

Решение № 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" /> 

Остается код для этого макета.

Второе изменение:

Итак, теперь ваш код accept и reject и list готов, теперь обсудим метод onOpened (..).

Confusion solution 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); } } 

Confusion solution 2, когда я беру палец вверх, он должен отображать целые списки listview или listview, чтобы сохранить его углы, чтобы он не работал

-> Я уже ответил на него выше

Swipelistview.closeAnimate (позиция); В противном случае он скрывает левое согласие и право отклонять изображение, когда ваш салфетки остается слева и справа.

Таким образом, конечный код выглядит следующим образом:

Весь макет 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 как

 listview.setOnTouchListener(new OnSwipeTouchListener(getActivity(), listview)); 

Класс OnSwipeTouchListener выглядит следующим образом:

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

Взгляните на эту библиотеку, это даст вам очень хорошие примеры и укажет u в правильном направлении. Удачи.

Пожалуйста, избегайте вышеприведенного подхода, иначе вы переходите на полный контроллер заполнения с логикой просмотра (что-то, что вам нужно избегать) посетите https://github.com/xenione/SwipeLayout.

Основанный на решении @Pratibha Sarode. Я адаптирую его, как показано ниже, с помощью listview, созданного с помощью cursoradaptor и базы данных: В основном виде:

  //-- 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(); } }); 

Это отличное удаление линий с переворачиванием!

Используя ответ на https://stackoverflow.com/a/31094315/2914140, я сделал это так.

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

Я думаю, что то же самое можно достичь, используя HorizontalScrollView внутри item_layout.xml.

Intereting Posts