2016-07-26 15 views
0

ドラッグアンドドロップリストビュー項目を数日間操作していて、検索がたくさんあります。"カスタムアダプター"を持つドラッグアンドドロップリストビュー項目OnItemLongClickListener

私は興味深いリンク[DragNDropListView] [1]が、残念ながら「SimpleCursorAdapter」

にも適用することができるしかし、私は

  1. にドラッグアンドドロップを適用する必要を発見した

    カスタムアダプタのListView項目(未CardViewもRecycleView)

  2. がBaseAdapter
  3. から
  4. OnItemLongClickListener
を拡張しました

public class BookingsListAdapter extends BaseAdapter implements DragNDropAdapter { 

//Fragments 
private static final int HOME_FRAGEMENT = 1; 
private static final int MANAGE_BOOKINGS_FRAGMENT = 2; 

// 
private Context context; 
private View rootView; 
private Bundle bundle; 
private LayoutInflater layoutInflater; 

//Bookings 
private ArrayList<PNRModel> pnrModels; 

//Fragments 
private int srcFragment; 

//Drag-and-Dop 
private int positions[]; 
private int handler; 

public BookingsListAdapter(Context context, View rootView, Bundle bundle, int srcFragment, ArrayList<PNRModel> pnrModels, int handler) { 
    super(); 

    this.context = context; 
    this.rootView = rootView; 
    this.bundle = bundle; 
    this.pnrModels = pnrModels; 
    setup(pnrModels.size()); 
    this.srcFragment = srcFragment; 
    this.handler = handler; 
    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

private void setup(int size) { 
    positions = new int[size]; 

    for (int i = 0; i < size; ++i) 
     positions[i] = i; 
} 

//Remove PNR Item 
public boolean remove(int position) { 

    boolean isRemoved = false; 

    PNRsTable pnrsTable = new PNRsTable(context, DatabaseInfo.DATABASE_NAME, null, DatabaseInfo.DATABASE_VERSION); 

    switch (srcFragment) { 

     case HOME_FRAGEMENT: 
      //Update" MyBookings" PNRsTable field with "N" 
      isRemoved = pnrsTable.updateMyBooking(pnrModels.get(position).getBookingReference(), "N"); 
      break; 
     case MANAGE_BOOKINGS_FRAGMENT: 
      //Delete PNR info from the DB PNRsTable 
      isRemoved = pnrsTable.deletePNR(pnrModels.get(position).getBookingReference()); 

      //Delete PNR details from the File 
      FileHelper.deleteFile(context, pnrModels.get(position).getBookingReference()); 
      break; 
     default: 
      break; 

    } 

    //Remove PNR from the Listview 
    pnrModels.remove(position); 
    notifyDataSetChanged(); 

    return isRemoved; 
} 


@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    return super.getDropDownView(positions[position], convertView, parent); 
} 

@Override 
public int getCount() { 
    return pnrModels.size(); 
} 

@Override 
public Object getItem(int position) { 
    return pnrModels.get(positions[position]); 
} 

@Override 
public int getItemViewType(int position) { 
    return super.getItemViewType(positions[position]); 
} 

@Override 
public long getItemId(int position) { 
    return positions[position]; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final BookingViewHolder bookingViewHolder; 
    final PNRModel listItem = (PNRModel) getItem(position); 

    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.item_my_booking, null); 
     bookingViewHolder = new BookingViewHolder(context, rootView , bundle, 
       srcFragment, convertView); 
     convertView.setTag(bookingViewHolder); 

    } else { 
     bookingViewHolder = (BookingViewHolder) convertView.getTag(); 
    } 

    //Set Listview Item Contents 
    bookingViewHolder.setItemContents(listItem); 

    //On Refresh click 
    bookingViewHolder.imgbtnRefresh.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      bookingViewHolder.setOnButtonClick(listItem, position); 

     } 
    }); 

    return convertView; 
} 

@Override 
public boolean isEnabled(int position) { 
    return super.isEnabled(positions[position]); 
} 

@Override 
public int getDragHandler() { 
    return handler; 
} 

@Override 
public void onItemDrag(DragNDropListView parent, View view, int position, long id) { 

} 

@Override 
public void onItemDrop(DragNDropListView parent, View view, int startPosition, int endPosition, long id) { 

    int position = positions[startPosition]; 

    if (startPosition < endPosition) 
     for (int i = startPosition; i < endPosition; ++i) 
      positions[i] = positions[i + 1]; 
    else if (endPosition < startPosition) 
     for (int i = startPosition; i > endPosition; --i) 
      positions[i] = positions[i - 1]; 

    positions[endPosition] = position; 
} 

@Override 
public void notifyDataSetChanged() { 
    setup(pnrModels.size()); 
    super.notifyDataSetChanged(); 
} 

}そして、私のアクティビティー:

は、ここで私のカスタムアダプタです

DragNDropListView lstvBookings = (DragNDropListView) rootView.findViewById(R.id.lstvBookings); 


//Display PNRs List in the ListView 
     BookingsListAdapter bookingsListAdapter = new BookingsListAdapter(context, rootView, bundle, srcFragment, pnrModels, R.id.rltvManageBookings); 
     lstvBookings.setDragNDropAdapter(bookingsListAdapter); 

     lstvBookings.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

       BookingViewHolder bookingViewHolder = (BookingViewHolder) view.getTag(); 

       view.startDrag(null, new View.DragShadowBuilder(view),view,0); 
       view.setVisibility(View.INVISIBLE); 



       return true; 
      } 
     }); 

答えて

1

あなたは自分のCustomAdapterは、その後、使用することができますhttps://github.com/terlici/DragNDropList/blob/master/src/com/terlici/dragndroplist/DragNDropSimpleAdapter.java
に似DragNDropAdapterを実装してみましょうことができます通常はDragNDropListViewを持つアダプタです。

UPDATE:サンプルカスタムアダプタ

package com.jason.test.dragndroplist; 

import java.util.List; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

public class DragNDropCustomAdapter extends BaseAdapter implements DragNDropAdapter { 
    private Context mContext; 
    private int mPosition[]; 
    private int mHandler; 
    private List<String> dataList; 

    public DragNDropCustomAdapter(Context context, List<String> data, int handler) { 
     super(); 
     mContext = context; 
     mHandler = handler; 

     dataList = data; 
     setup(data.size()); 
    } 

    private void setup(int size) { 
     mPosition = new int[size]; 

     for (int i = 0; i < size; ++i) 
      mPosition[i] = i; 
    } 

    @Override 
    public View getDropDownView(int position, View view, ViewGroup group) { 
     return super.getDropDownView(mPosition[position], view, group); 
    } 

    @Override 
    public Object getItem(int position) { 
     return dataList.get(mPosition[position]); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return super.getItemViewType(mPosition[position]); 
    } 

    @Override 
    public long getItemId(int position) { 
     return mPosition[position]; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup group) { 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (view == null) { 
      view = inflater.inflate(android.R.layout.simple_list_item_1, group, false); 
     } 
     TextView textView = (TextView) view.findViewById(android.R.id.text1); 
     textView.setText(dataList.get(mPosition[position])); 
     return view; 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return super.isEnabled(mPosition[position]); 
    } 

    @Override 
    public void onItemDrag(DragNDropListView parent, View view, int position, long id) { 

    } 

    @Override 
    public void onItemDrop(DragNDropListView parent, View view, int startPosition, int endPosition, long id) { 
     int position = mPosition[startPosition]; 

     if (startPosition < endPosition) 
      for (int i = startPosition; i < endPosition; ++i) 
       mPosition[i] = mPosition[i + 1]; 
     else if (endPosition < startPosition) 
      for (int i = startPosition; i > endPosition; --i) 
       mPosition[i] = mPosition[i - 1]; 

     mPosition[endPosition] = position; 
    } 

    @Override 
    public int getCount() { 
     return dataList.size(); 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     setup(dataList.size()); 
     super.notifyDataSetChanged(); 
    } 

    @Override 
    public int getDragHandler() { 
     return mHandler; 
    } 
} 
+0

私はそれを試してみましたが、うまくいきませんでした。コードに示されているコンストラクタパラメータを渡す必要があります。これは、SimpleAdapterからアダプタを継承するときに受け入れられません。 – Ghadeer

+0

カスタムアダプター – anhtuannd

+0

についての修正された回答を確認してください。まだ動作しません。私はDragNDropAdapterと私のリストビューがあるアクティビティを実装した後、私のカスタムアダプタのコードを追加しました。それを確認していただけますか? – Ghadeer

関連する問題