android menu html - Scorri l'elemento ListView Da destra a sinistra mostra il pulsante Elimina




5 Answers

EDIT: tra le altre opzioni c'è una bella libreria che potrebbe risolvere il tuo problema: https://github.com/daimajia/AndroidSwipeLayout

activity with

Ho un ListView personalizzato che mostra l'elenco di parole che selezionano dal database. Quando faccio scorrere questo oggetto listview voglio mostrare il pulsante Elimina come immagine qui sotto. E quando premo quel pulsante viene cancellato dal Database e aggiorna la listview. m

Ho già trovato questo codice di esempio here . Ma ancora non funziona.




Avevo lo stesso problema nel trovare una buona libreria per farlo. Alla fine, ho creato una libreria che può farlo: SwipeRevealLayout

Nel file gradle:

dependencies {
    compile 'com.chauthai.swipereveallayout:swipe-reveal-layout:1.4.0'
}

Nel tuo file xml:

<com.chauthai.swipereveallayout.SwipeRevealLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:mode="same_level"
    app:dragEdge="left">

    <!-- Your secondary layout here -->
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <!-- Your main layout here -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</com.chauthai.swipereveallayout.SwipeRevealLayout>

Quindi nel tuo file adattatore:

public class Adapter extends RecyclerView.Adapter {
  // This object helps you save/restore the open/close state of each view
  private final ViewBinderHelper viewBinderHelper = new ViewBinderHelper();

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    // get your data object first.
    YourDataObject dataObject = mDataSet.get(position); 

    // Save/restore the open/close state.
    // You need to provide a String id which uniquely defines the data object.
    viewBinderHelper.bind(holder.swipeRevealLayout, dataObject.getId()); 

    // do your regular binding stuff here
  }
}



Ho appena avuto il suo lavoro utilizzando il ViewSwitcher in un ListItem.

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<ViewSwitcher
    android:id="@+id/list_switcher"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:inAnimation="@android:anim/slide_in_left"
    android:outAnimation="@android:anim/slide_out_right"
    android:measureAllChildren="false" >
    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="center_vertical"
        android:maxHeight="50dp"
        android:paddingLeft="10dp" />

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:clickable="false"
        android:gravity="center"
        >

    <Button
        android:id="@+id/b_edit_in_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Edit"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"

         />
    <Button
        android:id="@+id/b_delete_in_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delete"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:background="@android:color/holo_red_dark"
        />
    </LinearLayout>
</ViewSwitcher>

In ListAdapter: implementa OnclickListeners per il pulsante Modifica e Elimina nel metodo getView (). Il problema qui è ottenere la posizione di ListItem su cui è stato fatto clic all'interno dei metodi onClick. per questo vengono utilizzati i metodi setTag () e getTag ().

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    final ViewHolder viewHolder;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_item, null);
        viewHolder.viewSwitcher=(ViewSwitcher)convertView.findViewById(R.id.list_switcher);
        viewHolder.itemName = (TextView) convertView
                .findViewById(R.id.tv_item_name);
        viewHolder.deleteitem=(Button)convertView.findViewById(R.id.b_delete_in_list);
        viewHolder.deleteItem.setTag(position);
        viewHolder.editItem=(Button)convertView.findViewById(R.id.b_edit_in_list);
        viewHolder.editItem.setTag(position);
        viewHolder.deleteItem.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                fragment.deleteItemList((Integer)v.getTag());
            }
        });

        viewHolder.editItem.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                fragment.editItemList(position);
            }
        });
        convertView.setTag(viewHolder);
} else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.itemName.setText(itemlist[position]);
return convertView;  
}

Nel frammento, aggiungi un ascoltatore di gesti per rilevare il gesto di Fling:

public class MyGestureListener extends SimpleOnGestureListener {
    private ListView list;

    public MyGestureListener(ListView list) {
        this.list = list;
    }

    // CONDITIONS ARE TYPICALLY VELOCITY OR DISTANCE

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // if (INSERT_CONDITIONS_HERE)

        ltor=(e2.getX()-e1.getX()>DELTA_X);
        if (showDeleteButton(e1))
        {
            return true;
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        // TODO Auto-generated method stub
        return super.onScroll(e1, e2, distanceX, distanceY);
    }

    private boolean showDeleteButton(MotionEvent e1) {
        int pos = list.pointToPosition((int) e1.getX(), (int) e1.getY());
        return showDeleteButton(pos);
    }

    private boolean showDeleteButton(int pos) {

        View child = list.getChildAt(pos);
        if (child != null) {
            Button delete = (Button) child
                    .findViewById(R.id.b_edit_in_list);
            ViewSwitcher viewSwitcher = (ViewSwitcher) child
                    .findViewById(R.id.host_list_switcher);
            TextView hostName = (TextView) child
                    .findViewById(R.id.tv_host_name);
            if (delete != null) {
                    viewSwitcher.setInAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left));
                    viewSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_out_right));
                }

                viewSwitcher.showNext();
                // frameLayout.setVisibility(View.VISIBLE);
            }
            return true;
        }
        return false;
    }
}

Nel metodo onCreateView del Fragment,

GestureDetector gestureDetector = new GestureDetector(getActivity(),
            new MyGestureListener(hostList));
    hostList.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            } else {
                return false;
            }

        }
    });

Questo ha funzionato per me. Dovrebbe perfezionarlo di più.




È disponibile un'app che mostra un listview che combina sia lo scorrimento da eliminare sia il trascinamento per riordinare gli elementi. Il codice è basato sul codice di Chet Haase per lo swiping-to-delete e il codice di Daniel Olshansky per il trascinamento da riordinare.

Il codice di Chet cancella immediatamente un oggetto. L'ho migliorato rendendo la funzione più simile a Gmail, dove lo scorrimento rivela una vista dal basso che indica che l'elemento è stato eliminato ma fornisce un pulsante Annulla in cui l'utente ha la possibilità di annullare l'eliminazione. Il codice di Chet ha anche un bug in esso. Se nella lista sono presenti meno elementi rispetto all'altezza del listview e si elimina l'ultimo elemento, l'ultimo elemento sembra non essere cancellato. Questo è stato risolto nel mio codice.

Il codice di Daniel richiede di premere a lungo su un oggetto. Molti utenti trovano questo non intuitivo in quanto tende a essere una funzione nascosta. Invece, ho modificato il codice per consentire un pulsante "Sposta". Basta premere il pulsante e trascinare l'elemento. Questo è più in linea con il modo in cui l'app Google News funziona quando si riordinano argomenti di notizie.

Il codice sorgente insieme a un'app demo è disponibile all'indirizzo: https://github.com/JohannBlake/ListViewOrderAndSwipe

Chet e Daniel sono entrambi di Google.

Il video di Chet sull'eliminazione di elementi può essere visualizzato su: https://www.youtube.com/watch?v=YCHNAi9kJI4

Il video di Daniel sul riordino degli oggetti può essere visto su: https://www.youtube.com/watch?v=_BZIvjMgH-Q

Una quantità considerevole di lavoro è andata a incollare tutto questo insieme per fornire un'esperienza UI apparente, quindi mi piacerebbe un Like o Up Vote. Per favore, anche protagonista del progetto in Github.




È una perdita di tempo implementare da zero questa funzionalità. Ho implementato la libreria consigliata da SalutonMondo e sono molto soddisfatta. È molto semplice da usare e molto veloce. Ho migliorato la libreria originale e ho aggiunto un nuovo listener di clic per il clic sull'elemento. Inoltre ho aggiunto la libreria impressionante di font ( http://fortawesome.github.io/Font-Awesome/ ) e ora puoi semplicemente aggiungere un nuovo titolo e specificare il nome dell'icona dal font fantastico.

Here il link github




Related