【问题标题】:How to drag list view item along with image in android如何在android中拖动列表视图项和图像
【发布时间】:2017-03-21 09:26:51
【问题描述】:

在我的应用程序中,我想拖动列表项。在我的列表项中,我有文本视图和图像。所以为此我遵循了以下网址

https://github.com/woxblom/DragListView

通过使用此示例,我更改了文本视图和图像视图,然后显示了我的数据。并且拖放也可以正常工作。但问题是形象不会改变。但是图像随着文本移动。所以我的观点是在删除项目文本更改后图像不会更改。那么如何改变图像呢。

这是我的活动:

public class MainActivity extends AppCompatActivity {
    private DragListView mDragListView;
    private ArrayList<Pair<Long, String>> mItemArray;
    private ArrayList arrayList_data = new ArrayList();
    private ArrayList arrayList_images = new ArrayList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        arrayList_data.add("Dashboard");
        arrayList_data.add("Evaluations");
        arrayList_data.add("Inventory");
        arrayList_data.add("Buy Leads");
        arrayList_data.add("Insurance");
        arrayList_data.add("Cartrade Price");
        arrayList_data.add("RTO Check");
        arrayList_data.add("Market Place");
        arrayList_data.add("Auctions");
        arrayList_data.add("Integrator Report");
        arrayList_data.add("What's New");

        arrayList_images.add(R.mipmap.menu_dashboard);
        arrayList_images.add(R.mipmap.menu_evaluations);
        arrayList_images.add(R.mipmap.menu_inventory);
        arrayList_images.add(R.mipmap.menu_buyleads);
        arrayList_images.add(R.mipmap.menu_insurance);
        arrayList_images.add(R.mipmap.menu_cartradeprice);
        arrayList_images.add(R.mipmap.menu_rtocheck);
        arrayList_images.add(R.mipmap.menu_marketplace);
        arrayList_images.add(R.mipmap.menu_acuttions);
        arrayList_images.add(R.mipmap.menu_integrator);
        arrayList_images.add(R.mipmap.whatsnew);

        mDragListView = (DragListView) findViewById(R.id.drag_list_view);

        mDragListView.setDragListListener(new DragListView.DragListListenerAdapter() {
            @Override
            public void onItemDragStarted(int position) {
//                mRefreshLayout.setEnabled(false);
                Toast.makeText(mDragListView.getContext(), "Start - position: " + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemDragEnded(int fromPosition, int toPosition) {
//                mRefreshLayout.setEnabled(true);
                if (fromPosition != toPosition) {
                    Toast.makeText(mDragListView.getContext(), "End - position: " + toPosition, Toast.LENGTH_SHORT).show();
                }
            }
        });

        mItemArray = new ArrayList<>();
        for (int i = 0; i < arrayList_data.size(); i++) {
            mItemArray.add(new Pair<>((long) i, arrayList_data.get(i).toString()));
        }

//        setupListRecyclerView();
        setupGridVerticalRecyclerView();
    }

    private void setupListRecyclerView() {
        mDragListView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        ItemAdapter listAdapter = new ItemAdapter(mItemArray, arrayList_images, R.layout.list_item, R.id.image, false);
        mDragListView.setAdapter(listAdapter, true);
        mDragListView.setCanDragHorizontally(false);
        mDragListView.setCustomDragItem(new MyDragItem(MainActivity.this, R.layout.list_item));
    }

    private void setupGridVerticalRecyclerView() {
        mDragListView.setLayoutManager(new GridLayoutManager(MainActivity.this, 3));
        ItemAdapter listAdapter = new ItemAdapter(mItemArray, arrayList_images, R.layout.grid_item, R.id.item_layout, true);
        mDragListView.setAdapter(listAdapter, true);
        mDragListView.setCanDragHorizontally(true);
        mDragListView.setCustomDragItem(null);

    }

    private static class MyDragItem extends DragItem {

        MyDragItem(Context context, int layoutId) {
            super(context, layoutId);
        }

        @Override
        public void onBindDragView(View clickedView, View dragView) {
            CharSequence text = ((TextView) clickedView.findViewById(R.id.text)).getText();
            ((TextView) dragView.findViewById(R.id.text)).setText(text);
            ImageView image = ((ImageView) clickedView.findViewById(R.id.image));
            ((ImageView) dragView.findViewById(R.id.image)).setImageDrawable(image.getDrawable());
            dragView.findViewById(R.id.item_layout).setBackgroundColor(dragView.getResources().getColor(R.color.list_item_background));
        }
    }
}

这是适配器类

class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder> {

    private int mLayoutId;
    private int mGrabHandleId;
    private boolean mDragOnLongPress;
    ArrayList<Integer> arl_images;

    ItemAdapter(ArrayList<Pair<Long, String>> list, ArrayList<Integer> arl_images, int layoutId, int grabHandleId, boolean dragOnLongPress) {
        mLayoutId = layoutId;
        mGrabHandleId = grabHandleId;
        mDragOnLongPress = dragOnLongPress;
        setHasStableIds(true);
        setItemList(list,arl_images);
        this.arl_images = arl_images;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(mLayoutId, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);
        String text = mItemList.get(position).second;
        holder.mText.setText(text);
        holder.image.setImageResource(arl_images.get(position));
        holder.itemView.setTag(mItemList.get(position));
    }

    @Override
    public long getItemId(int position) {
        return mItemList.get(position).first;
    }

    class ViewHolder extends DragItemAdapter.ViewHolder {
        TextView mText;
        ImageView image;

        ViewHolder(final View itemView) {
            super(itemView, mGrabHandleId, mDragOnLongPress);
            mText = (TextView) itemView.findViewById(R.id.text);
            image = (ImageView) itemView.findViewById(R.id.image);
        }

        @Override
        public void onItemClicked(View view) {
            Toast.makeText(view.getContext(), "Item clicked", Toast.LENGTH_SHORT).show();
        }

        @Override
        public boolean onItemLongClicked(View view) {
            Toast.makeText(view.getContext(), "Item long clicked", Toast.LENGTH_SHORT).show();
            return true;
        }
    }
}

【问题讨论】:

    标签: android listview gridview drag-and-drop


    【解决方案1】:

    使用 arl_images 列表交换代码更新函数 public void swapItems(int pos1, int pos2)in DragItemAdapter.java

      public void swapItems(int pos1, int pos2) {
            ......
                Collections.swap(mItemList, pos1, pos2);
                Collections.swap(mArl_imagesList, pos1, pos2);
                notifyDataSetChanged();
           ......
        }
    

    也更新ItemAdapter.java

     @Override 
        public void onBindViewHolder(ViewHolder holder, int position) {
            super.onBindViewHolder(holder, position);
            String text = mItemList.get(position);
            holder.mText.setText(text);
            holder.image.setImageResource(mArl_imagesList.get(position).second);//mArl_imagesList from DragItemAdapter
            holder.itemView.setTag(mItemList.get(position));
        } 
    

    【讨论】:

    • 感谢您的快速回复。但它不工作
    • no.. 终于也因为改变这个方法而得到了它...... public void changeItemPosition(int fromPos, int toPos) { if (mItemList != null && mItemList.size() > fromPos && mItemList. size() > toPos) { T item = mItemList.remove(fromPos);整数 item_int = arl_images.remove(fromPos); mItemList.add(toPos, item); arl_images.add(toPos, item_int); notifyItemMoved(fromPos, toPos); } }
    【解决方案2】:

    您可以使用 draglistview 库: https://android-arsenal.com/details/1/4036

    【讨论】:

    • 是的,我使用的是同一个库..它工作正常,但图像不会改变。我不知道在哪里更改代码
    • 您正在使用支架?然后删除它
    猜你喜欢
    • 2016-11-10
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多