Android DynamicGrid:拖曳交换位置

Android DynamicGrid是一个第三方开源项目,DynamicGrid在github上的项目主页是:https://github.com/askerov/DynamicGrid

它实现在一个网格布局内,拖曳任意子view实现动态的交换位置,这很类似手机的桌面,手机桌面的图标,均可自由拖曳实现摆放位置的交换,如动图所示:

DynamicGrid使用起来简单,需要注意:

(1)最好使用完全的BaseDynamicGridAdapter构造BaseDynamicGridAdapter构造函数,否则可能无法正常工作。

(2)通常以长按模式触发拖曳交换位置操作,所以一般在onItemLongClick里面startEditMode开始编辑。

(3)按返回键取消拖曳操作,代码比较固定,重写onBackPressed:

  1. @Override
  2. public void onBackPressed() {
  3.  
  4. //此处将取消拖曳编辑模式,取消方式为按返回键。
  5. if (gridView.isEditMode()) {
  6. gridView.stopEditMode();
  7. } else {
  8. super.onBackPressed();
  9. }
  10. }

给出一个完整的代码例子:

  1. package zhangphil.app;
  2.  
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.AdapterView;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12.  
  13. import org.askerov.dynamicgrid.BaseDynamicGridAdapter;
  14. import org.askerov.dynamicgrid.DynamicGridView;
  15.  
  16. import java.util.ArrayList;
  17. import java.util.List;
  18.  
  19. public class MainActivity extends Activity {
  20.  
  21. private DynamicGridView gridView;
  22.  
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27.  
  28. gridView = (DynamicGridView) findViewById(R.id.dynamicgrid);
  29.  
  30. ArrayList lists = new ArrayList();
  31. for (int i = 0; i < 100; i++) {
  32. lists.add("项目-" + i);
  33. }
  34.  
  35. //最好以完全方式构造,否则可能无法正常工作
  36. MyAdapter adapter = new MyAdapter(this, lists, 3);
  37. gridView.setAdapter(adapter);
  38.  
  39. gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
  40. @Override
  41. public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  42.  
  43. //长按触发拖曳交换位置操作。
  44. gridView.startEditMode(position);
  45.  
  46. return true;
  47. }
  48. });
  49.  
  50. gridView.setOnDragListener(new DynamicGridView.OnDragListener() {
  51. @Override
  52. public void onDragStarted(int position) {
  53. //Toast.makeText(getApplication(), "drag started at position " + position,Toast.LENGTH_SHORT).show();
  54. }
  55.  
  56. @Override
  57. public void onDragPositionsChanged(int oldPosition, int newPosition) {
  58. Toast.makeText(getApplication(), String.format("from %d to %d", oldPosition, newPosition), Toast.LENGTH_SHORT).show();
  59. }
  60. });
  61. }
  62.  
  63. @Override
  64. public void onBackPressed() {
  65.  
  66. //此处将取消拖曳编辑模式,取消方式为按返回键。
  67. if (gridView.isEditMode()) {
  68. gridView.stopEditMode();
  69. } else {
  70. super.onBackPressed();
  71. }
  72. }
  73.  
  74. private class MyAdapter extends BaseDynamicGridAdapter {
  75.  
  76. @Override
  77. public View getView(int i, View view, ViewGroup viewGroup) {
  78. View v = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1, null);
  79. TextView text = (TextView) v.findViewById(android.R.id.text1);
  80. text.setText("项目-" + i);
  81. v.setPadding(10, 10, 10, 10);
  82. return v;
  83. }
  84.  
  85. public MyAdapter(Context context, List<?> items, int columnCount) {
  86. super(context, items, columnCount);
  87. }
  88. }
  89. }

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6.  
  7. <org.askerov.dynamicgrid.DynamicGridView
  8. android:id="@+id/dynamicgrid"
  9. android:layout_height="wrap_content"
  10. android:layout_width="match_parent"
  11. android:numColumns="3"/>
  12. </LinearLayout>

Android DynamicGrid:拖曳交换位置的更多相关文章

  1. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  2. Android View各种尺寸位置相关的方法探究

    Android View各种尺寸位置相关的方法探究 本来想做一个View间的碰撞检测之类的. 动手做了才发现不是想象的那么简单. 首先,写好了碰撞检测的工具类如下: package com.mengd ...

  3. 用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。

    用C语言把双向链表中的两个结点交换位置,考虑各种边界问题. [参考] http://blog.csdn.net/silangquan/article/details/18051675

  4. android EditText获取光标位置并安插字符删除字符

    android EditText获取光标位置并插入字符删除字符1.获取光标位置int index = editText.getSelectionStart(); 2.在光标处插入字符int index ...

  5. Android 设置EditText光标位置(转)

    Android 设置EditText光标位置 最后 CharSequence text = edtTxt_my_account_edit_nickname.getText();if (text ins ...

  6. js 实现数组元素交换位置

    /** * 数组元素交换位置 * @param {array} arr 数组 * @param {number} index1 添加项目的位置 * @param {number} index2 删除项 ...

  7. Android中获取当前位置的使用步骤

    在Android中得到当前位置的步骤 1.在AndroidManifest.xml中声明权限 android.permission.ACCESS_FINE_LOCATION(或者android.per ...

  8. C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

    #include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...

  9. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

随机推荐

  1. Quartz在.Net网站中的使用方法(附Demo)

    现在做一个B/S项目需要用到计划任务,本来想自定写一个的,写了几句,突然想看看网上有没有现成可以用的.结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了.再找找看有没 ...

  2. AAC的ADTS头文件信息介绍

    遵循:BY-SA 署名-相同方式共享 4.0协议   作者:谭东 时间:2016年10月28日 环境:Windows 7   ADTS是Audio Data Transport Stream的简称. ...

  3. [Swift通天遁地]二、表格表单-(9)快速创建一个美观强大的表单

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用

    业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存runner(弱弱的说一句,本人看到这里的第一反应就是if-else,捂脸 ...

  5. .ignore配置问题1:配置后所忽略的文件不起作用

    gitignore可以指定git忽略指定文件. 问题: 想忽略一些文件在.gitignore文件中会配置对应的文件,但是有时候配置后还是没有起作用: 我在element-ui封装个性化组件时,需要更换 ...

  6. ACM_新七步诗(深搜)

    新七步诗 Time Limit: 2000/1000ms (Java/Others) Problem Description: 突然的一天,小锴做了一个梦,梦见自己来到了三国,而自己也成了梦寐以求的帅 ...

  7. 在vSphere Client上安装虚拟机工具VMware Tools

    一.什么是虚拟机工具 VMware Tools是一套安装在虚拟机操作系统中的实用程序.VMware Tools可提高虚拟机的性能,并在 VMware产品中实现多个易于使用的功能. 尽管客户机操作系统在 ...

  8. P3368 【模板】树状数组 2(树状数组维护差分序列)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  9. tp5.0分页样式调控

    基础的分页调用 /** * 控制器部分代码 */ //实例化模型 $areasModel=new Areas(); //分页数据集 $listarea=$areasModel->paginate ...

  10. Android:用签名打包后微信分享失效

    刚开始使用微信分享,申请的微信appid也可以在直接使用,分享成功! 当我使用自己的签名打包分享时却分享失败,一闪而过,好郁闷的说,为什么之前没有打包就可以,签名打包后就不可以了... 开始查找各种资 ...