GridView上下移动该列上的列

我有一个3×3网格视图。 想像下面。

1 2 3 4 5 6 7 8 9 

现在我想实现什么

我希望网格视图的列向上和向下移动。

考虑一下,网格视图的第一列。 那是

 1 4 7 

现在,如果我触摸此列上的任何位置,无论是在1还是在4或7,并向上或向下任一方向滑动。 然后,我想把列移动1或2个地方。

让我明白这一点

如果我通过触摸7向上滑动,它应该是这样的结果

 1 4 2 3 7 5 6 8 9 

或者,如果我触摸第二列并在下面的方向移动,那么它将看起来像下面的东西

 1 3 4 2 6 7 5 9 8 

如果我移动2格单元格的列,那么它看起来像

 1 3 4 6 7 2 9 5 8 

对于每一列,我应该能够移动一个或两个单元格的列,这取决于我滚动列的次数。

还有一件事如果我滚动列很less,如果它不是完全适合任何网格细胞到所需的位置,那么它应该自动适应网格单元格,以贴近位置。

我在这里search了太多的关于堆栈溢出的问题,并且查询了一大堆谷歌。 但是我没有得到我想要的东西。

如果我没有解释清楚,那么告诉我。 我会尽力解释更多。 任何想法,任何暗示或任何诡计将是可观的。

编辑

如果我将列移动超过3个网格,然后释放触摸,列将移动到两个元素 。 像这样

 1 3 4 6 7 2 9 5 8 

任何启动的想法将是可观的

谢谢

Solutions Collecting From Web of "GridView上下移动该列上的列"

要做你所要求的事情,需要你负责GridView的canvas,closures正在被触摸的列,并为拖动,拖动等做自己的绘制。一旦移动完成,你将需要调整通过GridView的列中的意见,以保持记账。 我会看看讨论视图移动的在线文档。 “拖放和缩放”将是一个很好的开始。

这种方法将会出现一些“陷阱”。 如果你只是想学习这个技术,那么我会说你的方法是好的。 如果你想完成这个效果并且像devise的那样使用GridView的底层实现(滚动,边缘效果,甩尾等等),我build议另一种方法。

您可以通过并排alignment三个1×3的网格视图来build立一个GridView的外观,而不是一个3×3的GridView 。 (真正的网格视图将是1×11,以适应垂直幻灯片的最大范围)。如果编码为支持多个网格视图,则每个网格视图可以由单个适配器支持。 由于每列都是自己的网格视图,每列可以独立滑动。

这种方法的优点是,你可以得到你想要的效果,而不会扭曲底层的GridView类。 同样的方法可以使用你现有的使用button的方法。

我希望这对你有帮助。


我很好奇如何实施我的build议。 下面是一个具有三个GridView实现的示例应用程序(如上所述)和一个相同的video。

在这里输入图像说明

MainActivity.java

 public class MainActivity extends AppCompatActivity implements GridView.OnScrollListener { @Override public void onCreate(Bundle savedInstanceState) { final GridViewAdapter adapter = new GridViewAdapter(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupGridView(R.id.gridview0, adapter); setupGridView(R.id.gridview1, adapter); setupGridView(R.id.gridview2, adapter); } private void setupGridView(int id, GridViewAdapter adapter) { final GridView gridview = (GridView) findViewById(id); gridview.setAdapter(adapter); // Temporary scroll listener until initial scroll to position is done. // This hides the initial movement of the grid cells. gridview.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { gridview.setOnScrollListener(MainActivity.this); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // Do nothing } }); gridview.smoothScrollToPositionFromTop(2, 0); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { final int top = view.getChildAt(0).getTop(); final int itemHeight = ((GridViewAdapter) (view.getAdapter())).getItemHeight(); // top <= 0 if (top > -(itemHeight / 2)) { // Less than 1/2 cell height out of place - shift down. view.scrollListBy(top); } else { // Shift up view.scrollListBy(top + itemHeight); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // Do nothing } @SuppressWarnings("unused") private static final String TAG = "MainActivity"; } 

GridViewAdapter.java

 class GridViewAdapter extends BaseAdapter { GridViewAdapter() { } @Override public int getCount() { return mStrings.length / GRID_COLUMN_COUNT; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } // create a new TextView for each item referenced by the Adapter @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView; final int column = Integer.parseInt((String) parent.getTag()); if (convertView == null) { // if it's not recycled, initialize some attributes textView = new TextView(parent.getContext()); GridView.LayoutParams params = new GridView.LayoutParams(GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT); textView.setLayoutParams(params); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); textView.setGravity(Gravity.CENTER); } else { // Recycle the view but keep old attributes since they don't change. textView = (TextView) convertView; } textView.setText(mStrings[position * GRID_COLUMN_COUNT + column]); return textView; } int getItemHeight() { return GRID_ITEM_HEIGHT; } private final static String[] mStrings = { "", "", "", "", "", "", "", "", "", "", "", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "", "", "", "", "", "", "", "", "", "", "", "" }; private static final int GRID_ITEM_HEIGHT = 150; // in pixels private static final int GRID_ITEM_WIDTH = 150; // in pixels private static final int GRID_COLUMN_COUNT = 3; } 

activity_main.java

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal"> <!-- Sorry for the dimensions in pixels. It just makes everything easier. Non-pixel dimensions (dp) should be used here and accommodations made in the code. --> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview0" android:layout_width="150px" android:layout_height="1050px" android:columnWidth="150px" android:horizontalSpacing="0dp" android:numColumns="1" android:scrollbars="none" android:tag="0" android:verticalSpacing="0dp" /> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview1" android:layout_width="150px" android:layout_height="1050px" android:columnWidth="150px" android:horizontalSpacing="0dp" android:numColumns="1" android:scrollbars="none" android:tag="1" android:verticalSpacing="0dp" /> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview2" android:layout_width="150px" android:layout_height="1050px" android:columnWidth="150px" android:horizontalSpacing="0dp" android:numColumns="1" android:scrollbars="none" android:tag="2" android:verticalSpacing="0dp" /> </LinearLayout> 

如果我移动超过3个网格单元的列,那么它会移动或不移动。 如果它移动了多less个单元格?

我没有任何代码块,但我可以解释你如何可以完成任务

你需要创build一个像这样的空单元的网格

ist – > – – – – – – – – –

第二 – > – – – – – – – – –

第三 – > – – – – – – – – –

4 – > – – – 1 2 3 – – –

第5 – > – – – 4 5 6 – – –

6th – > – – – 7 8 9 – – –

7日 – > – – – – – – – – –

8日 – > – – – – – – – – –

9日 – > – – – – – – – – –

现在刷上去得到同一列的所有元素,然后移动到上面

希望这个答案能够满足你的要求