2015-06-18 12 views
9

Ich möchte Listenansicht in das ich will, wenn ich von links nach rechts streichen, in der linken Ecke Display ein Akzeptieren (true) Symbol (nicht anklickbar - zeigen nur Farbe ändern, wenn streichen sie nach links nach rechts) wie folgenden Screenshot,Android ListView Swipe nach rechts und links zu akzeptieren und ablehnen

enter image description here

, wenn ich alle links streichen sie es akzeptieren, nach rechts (in, dass ich akzeptieren genannt api), und wenn ich richtig Swipe es so erscheint nach links ,

enter image description here

Diese iphone gemacht, aber ich finde nicht genau, wie dies in Android zu tun, ich so viel googeln, aber nicht genau das finden, was ich will,

ich versuche folgendes Beispiel: http://www.tutecentral.com/android-swipe-listview/

aber, dass wenn ich wische links nach rechts und rechts nach links gleiche onOpened (..) -Methode aufgerufen, so dass es verwirrend zu: wann zu nennen akzeptieren und ablehnen api, weil die gleiche Methode bei jeder Art von Swipe aufgerufen.

und ich auch wollen, wenn ich nur links-rechts oder rechts-links wischen nur die Zeit akzeptieren Bild (linke Seite) und ablehnen (Bild rechts ablehnen) Display, wenn ich finger nehmen es muss gesamte listview anzeigen (nicht beide Seitenbild).

Also bitte helfen Sie mir, wie dies zu tun ist.

Meine Frage ist etwas verwirrend und auch mit einiger niedrigen Grammatik, aber ich weiß, wie donw gesamte Animation zu erklären, so versuche ich, wie oben zu schreiben,

Wenn jemand mir helfen, es sehr zu schätzen.

+2

bro, hast du es funktioniert..wenn ja bitte teilen Sie die Lösung. Ich habe genau die gleiche Anforderung. – dreamdeveloper

+0

Hellow @dreamdeveloper, Sehen Sie die akzeptierte Lösung, die unten für mich funktioniert. –

+0

haben Sie die in http://www.tutecentral.com/android-swipe-listview/ erwähnte Lösung verwendet? und dann die Modifikation wie in der akzeptierten Lösung beschrieben? – dreamdeveloper

Antwort

12

Lösung Nummer 1:

Sie mögen folgende zu tun haben "in der Nähe", um Ihre Funktionalität zu erreichen,

Wickeln Sie den Adapter Ihrer Listview

wie folgt vor:

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

Erstellen Sie ein Hintergrund-Layout für jede Wischrichtung

wie folgend:

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

Sie haben beide Bibliotheken und Beispiel aus der hier: https://github.com/wdullaer/SwipeActionAdapter

Dies wird nicht genau wie Sie wollen, aber ich hoffe, dass dies Ihnen helfen, Ihre Funktionalität zu erfüllen.

Lösung Nummer 2:

Lösung 2 ist etwas Code in der Eingesetzte Code zu ändern: http://www.tutecentral.com/android-swipe-listview/

i Code aus dem Link versuchen hatte http://www.tutecentral.com/android-swipe-listview/ und einige Codes zu ändern und erfolgreich Lösen Sie Ihr Problem (Ihre Verwirrung) über onOpened (..) Methode (genannt von links nach rechts und umgekehrt)

Erste Änderung:

  1. custom_row.xml Layout-Datei hat drei Schaltfläche swipe_button1 bis 3, entfernen Mitte von ihnen.

  2. Copy Paste für folgenden Code bleiben zwei Tasten:

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

bleibt Code gleiche für dieses Layout.

Zweite Änderung:

So, jetzt Ihr akzeptieren und ablehnen und Listencode ist bereit, jetzt über onOpened (..) Methode diskutieren.

Verwirrung Lösung 1 - Sie sagten, Ihre onOpend (...) Methode gleichnamige sowohl von links nach rechts und umge Verse

-> nur folgende Änderungen:

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


     } 

Verwechslungslösung 2 wenn ich finger nehmen muss es muss gesamte listeansicht oder listview seiten sollten es bleiben ecken so funktioniert es nicht

-> ich bereits beantwortet es in über

genannt swipelistview.closeAnimate (position); in beiden wenn es sonst links verstecken akzeptieren und rechts ablehnen Bild, wenn Sie Ihren Swipe nach links und rechts über.

So endgültige Code folgt:

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> 

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

} 

Andere Code und Bibliothek bleibt gleich, es für Sie hilfreich und andere auch, also genieße.

+0

ich werde es versuchen n dann zurück zu dir ... –

+0

ja, Lösung 2: ist genau das, was ich will, ehrfürchtig beantwortet danke ... –

+0

Sie müssen möglicherweise zwei Codes in ItemAdapter, die Taste 2 verwandt ist, kommentieren.Die klicken Sie auf Listener und Deklaration. //holder.button2=(Button) row.findViewById(R.id.swipe_button2); und der Onkliklistener. – dreamdeveloper

1

Werfen Sie einen Blick auf this Bibliothek, es wird Ihnen sehr gute Beispiele geben und wird Ihnen in die richtige Richtung zeigen. Viel Glück.

+0

Ich versuchte diese Bibliothek ... aber Listview Seiten sollten es Ecken behalten, so dass es nicht funktioniert –

+0

Ja, die Bibliothek hat nicht die genaue Lösung für Sie. Aber es hat die Handhabung der Berührungsereignisse, dies sollte dir in die richtige Richtung führen. – EE66

+0

@ EE66: Irgendeine Idee für das gleiche Swipe-Menü für erweiterbare Listview .. stackoverflow.com/questions/36330126/... ?? –

4

Es funktionierte für mich ... Ich hoffe, es wird für Sie arbeiten ..!wie folgt

Satz OnTouchListener zur Listenansicht als

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

Die OnSwipeTouchListener Klasse:

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

    } 
} 
+0

Ausnahme passiert bei e.getx – Brave

+0

Ich habe versucht, Ihre Lösung und neu umgestaltete Klassen. Vielleicht falsch gemacht, aber ein onFling-Event wird nur einmal für eine Bewegung aufgerufen. Und wenn ich 'listView.setOnTouchListener' verwende, wird es viel häufiger aufgerufen. Also, danke für eine Richtung, wird versuchen, sich weiter zu entwickeln. – CoolMind

1

Bitte vermeiden Sie oben Ansatz sonst werden Sie voll füllen Controller mit Blick Logik (etwas, das Sie haben vermeiden Sie) besuchen Sie https://github.com/xenione/SwipeLayout gibt es einen Swipe Maker mit einigen Beispielen

+1

Dies ist die beste Bibliothek über Swipe Layout. Andere Bibliotheken erhalten viele Fehler. – Brave

+0

@Brave Danke !!! – Xenione

1

basierend auf @Pratibha Sarode Lösung ich passe es wie folgt mit einer Listenansicht mit einer CursorAdaptor und einer Datenbank poupulated: In der Haupttätigkeit:

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

Es Arbeit der großen Löschen Linien mit Swipe movment!

0

Mit einer Antwort bei https://stackoverflow.com/a/31094315/2914140 habe ich es so gemacht.

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

In getView des Adapters schreiben:

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

denke ich das gleiche mit Hilfe HorizontalScrollView innerhalb item_layout.xml erreicht werden kann.

Verwandte Themen