2017-06-10 7 views
-2

This is a application imageWie kann ich RecyclerView-Elemente ziehen und ablegen?

Ich habe ein Projekt auf Android-Studio und ich möchte per Drag & Bilder Artikel in RecylerView zu einem Container auf meine Tätigkeit fallen ...

In meiner Tätigkeit Ich habe einen Container-Fragment und dies zeigt Fragmente mit einem RecyclerView und dieser Anzeige Tier Teile in JSON-Verbindung, ist es möglich, eine Drag And Drop zu machen, Bilder zu Cointainer zu bewegen, um einen Tiercharakter zu machen und Daten an meine Datenbank zu senden, und wie ich es mache ???

+0

Das sieht wie eine Ja/Nein-Frage aus. –

+0

Verwenden Sie "ItemTouchHelper" überprüfen Sie diese https://stackoverflow.com/questions/29901044/drag-and-drop-items-in-recyclerview-with-gridlayoutmanager –

Antwort

1

Sie haben ItemTouchHelper zu implementieren und dies ist ein Beispiel, wie es zu tun:

1- Fügen Sie Ihre recyclerview

<android.support.v7.widget.RecyclerView 
     android:id="@+id/note_recycler_view" 
     android:scrollbars="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

2 - Hinzufügen Model-Klasse

public class Customer { 
private Long id; 
private String name; 
private String emailAddress; 
private int imageId; 
private String imagePath; 
} 

3 - Abhängigkeiten hinzufügen

compile 'de.hdodenhof:circleimageview:2.0.0' 
compile 'com.squareup.picasso:picasso:2.5.2' 
compile 'com.yqritc:recyclerview-flexibledivider:1.2.6' 
compile 'com.google.code.gson:gson:2.3.1' 

4 - Hinzufügen Erlaubnis Internet

<uses-permission android:name="android.permission.INTERNET" /> 

5- neue List von Customer in Ihrer Aktivität erstellen und Kunden in hinzufügen.

6- eine neue Klasse erstellen namens CustomerListAdapter

package com.okason.draganddrop; 

import android.content.Context; 
import android.graphics.Color; 
import android.support.v4.view.MotionEventCompat; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.okason.draganddrop.listeners.OnCustomerListChangedListener; 
import com.okason.draganddrop.listeners.OnStartDragListener; 
import com.okason.draganddrop.utilities.ItemTouchHelperAdapter; 
import com.okason.draganddrop.utilities.ItemTouchHelperViewHolder; 
import com.squareup.picasso.Picasso; 

import java.util.Collections; 
import java.util.List; 

/** 
* Created by Valentine on 10/18/2015. 
*/ 
public class CustomerListAdapter extends 
     RecyclerView.Adapter<CustomerListAdapter.ItemViewHolder> 
     implements ItemTouchHelperAdapter { 

private List<Customer> mCustomers; 
private Context mContext; 
private OnStartDragListener mDragStartListener; 
private OnCustomerListChangedListener mListChangedListener; 

public CustomerListAdapter(List<Customer> customers, Context context, 
          OnStartDragListener dragLlistener, 
          OnCustomerListChangedListener listChangedListener){ 
    mCustomers = customers; 
    mContext = context; 
    mDragStartListener = dragLlistener; 
    mListChangedListener = listChangedListener; 
} 


@Override 
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View rowView = LayoutInflater.from 
    (parent.getContext()).inflate(R.layout.row_customer_list, parent, false); 
    ItemViewHolder viewHolder = new ItemViewHolder(rowView); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(final ItemViewHolder holder, int position) { 

    final Customer selectedCustomer = mCustomers.get(position); 

    holder.customerName.setText(selectedCustomer.getName()); 
    holder.customerEmail.setText(selectedCustomer.getEmailAddress()); 
    Picasso.with(mContext) 
      .load(selectedCustomer.getImagePath()) 
      .placeholder(R.drawable.profile_icon) 
      .into(holder.profileImage); 



    holder.handleView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { 
       mDragStartListener.onStartDrag(holder); 
      } 
      return false; 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return mCustomers.size(); 
} 

@Override 
public void onItemMove(int fromPosition, int toPosition) { 
    Collections.swap(mCustomers, fromPosition, toPosition); 
    mListChangedListener.onNoteListChanged(mCustomers); 
    notifyItemMoved(fromPosition, toPosition); 
} 

@Override 
public void onItemDismiss(int position) { 

} 

public static class ItemViewHolder extends RecyclerView.ViewHolder implements 
     ItemTouchHelperViewHolder { 
    public final TextView customerName, customerEmail; 
    public final ImageView handleView, profileImage; 


    public ItemViewHolder(View itemView) { 
     super(itemView); 
     customerName = (TextView)itemView.findViewById(R.id.text_view_customer_name); 
     customerEmail = (TextView)itemView.findViewById(R.id.text_view_customer_email); 
     handleView = (ImageView)itemView.findViewById(R.id.handle); 
     profileImage = (ImageView)itemView.findViewById(R.id.image_view_customer_head_shot); 
    } 

    @Override 
    public void onItemSelected() { 
     itemView.setBahttp://valokafor.com/wp-admin/post.php?post=1804&action=edit#ckgroundColor(Color.LTGRAY); 
    } 

    @Override 
    public void onItemClear() { 
     itemView.setBackgroundColor(0); 
    } 
} 
} 

7- ItemTouchHelper In Ihrem Dienstprogramme-Paket implementieren, ItemTouchHelperAdapter.java hinzufügen und unten ist der Inhalt:

public interface ItemTouchHelperAdapter { 
/** 
* Called when an item has been dragged far enough to trigger a move. This is called every time 
* an item is shifted, and not at the end of a "drop" event. 
* 
* @param fromPosition The start position of the moved item. 
* @param toPosition Then end position of the moved item. 

*/ 
void onItemMove(int fromPosition, int toPosition); 


/** 
* Called when an item has been dismissed by a swipe. 
* 
* @param position The position of the item dismissed. 

*/ 
void onItemDismiss(int position); 
} 

Und in Ihrem Dienstprogramme Paket, fügen Sie ItemTouchHelperViewHolder.java und unten ist der Inhalt:

public interface ItemTouchHelperViewHolder { 
    /** 
     * Implementations should update the item view to indicate it's active state. 
    */ 
    void onItemSelected(); 


    /** 
    * state should be cleared. 
    */ 
    void onItemClear(); 
} 

In Ihrem Versorgungspaket, SimpleItemTouchHelperCallback.java hinzufügen und hier ist der Inhalt:

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback { 

private final ItemTouchHelperAdapter mAdapter; 

public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { 
    mAdapter = adapter; 
} 

@Override 
public boolean isLongPressDragEnabled() { 
    return true; 
} 

@Override 
public boolean isItemViewSwipeEnabled() { 
    return false; 
} 

@Override 
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
    final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; 
    final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; 
    return makeMovementFlags(dragFlags, swipeFlags); 
} 

@Override 
public boolean onMove(RecyclerView recyclerView, 
RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { 
    mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition()); 
    return true; 
} 

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) { 
    mAdapter.onItemDismiss(viewHolder.getAdapterPosition()); 
} 

@Override 
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 
     ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 
     itemViewHolder.onItemSelected(); 
    } 

    super.onSelectedChanged(viewHolder, actionState); 
} 

@Override 
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
    super.clearView(recyclerView, viewHolder); 

    ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 
    itemViewHolder.onItemClear(); 
} 
} 

ein Paket namens Hörer hinzufügen und eine Schnittstelle hinzufügen, genannt OnStartDragListener.java und hier ist der Inhalt:

public interface OnCustomerListChangedListener { 
void onNoteListChanged(List<Customer> customers); 
} 

Implementieren eigene Zeilen

private RecyclerView mRecyclerView; 
private CustomerListAdapter mAdapter; 
private RecyclerView.LayoutManager mLayoutManager; 
private ItemTouchHelper mItemTouchHelper; 
private List<Customer> mCustomers; 

Nach der onCreate Methode, diese Methode hinzufügen. Und dann rufen Sie diese Methode von der onCreate() -Methode wahrscheinlich nach dem Aufruf der Toolbar auf. Ignoriere die Fehlerwarnung für eine Minute.

private void setupRecyclerView(){ 
     mRecyclerView = (RecyclerView) `findViewById(R.id.note_recycler_view);` 
     mRecyclerView.setHasFixedSize(true); 
     mLayoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mCustomers = SampleData.addSampleCustomers(); 

     //setup the adapter with empty list 
     mAdapter = new CustomerListAdapter(mCustomers, this, this, this); 
     ItemTouchHelper.Callback callback = new `SimpleItemTouchHelperCallback(mAdapter);` 
     mItemTouchHelper = new ItemTouchHelper(callback); 
     mItemTouchHelper.attachToRecyclerView(mRecyclerView); 
mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this) 

       .colorResId(R.color.colorPrimaryDark) 
       .size(2) 
       .build()); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

Aktualisieren Sie die Unterschrift Ihres MainActivity die beiden Zuhörer zu implementieren, die wir wie unten und nutzen Android Studio schnelle Lösung hinzugefügt, um die Methoden zu implementieren.

public class MainActivity extends AppCompatActivity 
implements OnCustomerListChangedListener, 
    OnStartDragListener{ 

Hier ist die Implementierung einer der Methoden, und wir werden die andere im nächsten Abschnitt implementieren.

@Override 
public void onStartDrag(RecyclerView.ViewHolder viewHolder) { 
    mItemTouchHelper.startDrag(viewHolder); 

} 

An dieser Stelle Ihrer Drag & Drop-Liste sollte arbeiten und wir wollen nun die Position der Listenelemente erinnern, nachdem sie neu organisiert wurde. Wie ich bereits am Anfang des Beitrags erwähnt habe, wird dies dadurch erreicht, dass die IDs der Listenelemente in SharedPreference gespeichert werden. Gehen Sie also voran und fügen Sie die folgenden Klassenmitglieder am Anfang der Datei hinzu.

private SharedPreferences mSharedPreferences; 
private SharedPreferences.Editor mEditor; 
public static final String LIST_OF_SORTED_DATA_ID = "json_list_sorted_data_id"; 
public final static String PREFERENCE_FILE = "preference_file"; 

Und im onCreate() instanziiert die SharedPreference etwa so:

mSharedPreferences = this.getApplicationContext() 
      .getSharedPreferences(PREFERENCE_FILE, Context.MODE_PRIVATE); 
    mEditor = mSharedPreferences.edit(); 

Dann die andere Methode voran gehen und implementieren, die, wenn die Liste Änderungen zuhört und hier ist die Umsetzung dieses Verfahrens:

@Override 
public void onNoteListChanged(List<Customer> customers) { 
    //after drag and drop operation, the new list of Customers is passed in here 

    //create a List of Long to hold the Ids of the 
    //Customers in the List 
    List<Long> listOfSortedCustomerId = new ArrayList<Long>(); 

    for (Customer customer: customers){ 
     listOfSortedCustomerId.add(customer.getId()); 
    } 

    //convert the List of Longs to a JSON string 
    Gson gson = new Gson(); 
    String jsonListOfSortedCustomerIds = gson.toJson(listOfSortedCustomerId); 


    //save to SharedPreference 
    mEditor.putString(LIST_OF_SORTED_DATA_ID, jsonListOfSortedCustomerIds).commit(); 
    mEditor.commit(); 
} 

Dann fügen Sie diese Methode, um Ihre MainActivity.java:

private List<Customer> getSampleData(){ 

    //Get the sample data 
    List<Customer> customerList = SampleData.addSampleCustomers(); 

    //create an empty array to hold the list of sorted Customers 
    List<Customer> sortedCustomers = new ArrayList<Customer>(); 

    //get the JSON array of the ordered of sorted customers 
    String jsonListOfSortedCustomerId = mSharedPreferences.getString(LIST_OF_SORTED_DATA_ID, ""); 

    //check for null 
    if (!jsonListOfSortedCustomerId.isEmpty()){ 

     //convert JSON array into a List<Long> 
     Gson gson = new Gson(); 
     List<Long> listOfSortedCustomersId = gson.fromJson 
     (jsonListOfSortedCustomerId, new TypeToken<List<Long>>(){}.getType()); 

     //build sorted list 
     if (listOfSortedCustomersId != null && listOfSortedCustomersId.size() > 0){ 
      for (Long id: listOfSortedCustomersId){ 
       for (Customer customer: customerList){ 
        if (customer.getId().equals(id)){ 
         sortedCustomers.add(customer); 
         customerList.remove(customer); 
         break; 
        } 
       } 
      } 
     } 

     //if there are still customers that were not in the sorted list 
     //maybe they were added after the last drag and drop 
     //add them to the sorted list 
     if (customerList.size() > 0){ 
      sortedCustomers.addAll(customerList); 
     } 

     return sortedCustomers; 
    }else { 
     return customerList; 
    } 
} 

nun die Zeile in setupRecyclerView() aktualisieren, die Sie aus den Daten erhalten:

mCustomers = SampleData.addSampleCustomers(); 

zu:

mCustomers = getSampleData(); 

Here is the source of my answer können Sie weitere Informationen und eine Beschreibung über jeden einzelnen Schritt finden.

+1

Dies ist eine Borderline [Link-only-Antwort] (// meta. stackexchange.com/q/8231). Sie sollten Ihre Antwort so erweitern, dass sie so viele Informationen enthält, und den Link nur als Referenz verwenden. – FrankerZ

+0

Ok danke, ich werde es bearbeiten. – Glory

Verwandte Themen