1.导入draggridviewlibrary
2.默认频道显示
public class MainActivity extends AppCompatActivity {
private GridView gridView;
ArrayList<ChannelItem> userChannelList = new ArrayList<ChannelItem>();
private Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = (GridView) findViewById(R.id.gridView);
bt = (Button) findViewById(R.id.bt);
}
@Override
protected void onResume() {
super.onResume();
userChannelList = ((ArrayList<ChannelItem>) ChannelManage.getManage(AppApplication.getApp().getSQLHelper()).getUserChannel());
List<String> list=new ArrayList<>();
for (int i = 0; i < userChannelList.size(); i++) {
list.add(userChannelList.get(i).getName());
}
gridView.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,list));
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,ChannelActivity.class);
startActivity(intent);
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.bwie.channelmanager.MainActivity">
<GridView
android:id="@+id/gridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="4"></GridView>
<Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="频道管理"
android:layout_marginTop="200dp"/>
</RelativeLayout>
3.频道管理页面
package com.bwie.channelmanager;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import channelmanager.bwie.com.draggridviewlibrary.adapter.DragAdapter;
import channelmanager.bwie.com.draggridviewlibrary.adapter.OtherAdapter;
import channelmanager.bwie.com.draggridviewlibrary.app.AppApplication;
import channelmanager.bwie.com.draggridviewlibrary.bean.ChannelItem;
import channelmanager.bwie.com.draggridviewlibrary.bean.ChannelManage;
import channelmanager.bwie.com.draggridviewlibrary.view.DragGrid;
import channelmanager.bwie.com.draggridviewlibrary.view.OtherGridView;
/**
* 频道管理
* @Author RA
* @Blog http://blog.csdn.net/vipzjyno1
*/
public class ChannelActivity extends Activity implements AdapterView.OnItemClickListener {
/** 用户栏目的GRIDVIEW */
private DragGrid userGridView;
/** 其它栏目的GRIDVIEW */
private OtherGridView otherGridView;
/** 用户栏目对应的适配器,可以拖动 */
DragAdapter userAdapter;
/** 其它栏目对应的适配器 */
OtherAdapter otherAdapter;
/** 其它栏目列表 */
ArrayList<ChannelItem> otherChannelList = new ArrayList<ChannelItem>();
/** 用户栏目列表 */
ArrayList<ChannelItem> userChannelList = new ArrayList<ChannelItem>();
/** 是否在移动,由于这边是动画结束后才进行的数据更替,设置这个限制为了避免操作太频繁造成的数据错乱。 */
boolean isMove = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.subscribe_activity);
initView();
initData();
}
/** 初始化数据*/
private void initData() {
userChannelList = ((ArrayList<ChannelItem>) ChannelManage.getManage(AppApplication.getApp().getSQLHelper()).getUserChannel());
otherChannelList = ((ArrayList<ChannelItem>)ChannelManage.getManage(AppApplication.getApp().getSQLHelper()).getOtherChannel());
userAdapter = new DragAdapter(this, userChannelList);
userGridView.setAdapter(userAdapter);
otherAdapter = new OtherAdapter(this, otherChannelList);
otherGridView.setAdapter(this.otherAdapter);
//设置GRIDVIEW的ITEM的点击监听
otherGridView.setOnItemClickListener(this);
userGridView.setOnItemClickListener(this);
}
/** 初始化布局*/
private void initView() {
userGridView = (DragGrid) findViewById(R.id.userGridView);
otherGridView = (OtherGridView) findViewById(R.id.otherGridView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/** GRIDVIEW对应的ITEM点击监听接口 */
@Override
public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) {
//如果点击的时候,之前动画还没结束,那么就让点击事件无效
if(isMove){
return;
}
switch (parent.getId()) {
case R.id.userGridView:
//position为 0,1 的不可以进行任何操作
if (position != 0 && position != 1) {
final ImageView moveImageView = getView(view);
if (moveImageView != null) {
TextView newTextView = (TextView) view.findViewById(R.id.text_item);
final int[] startLocation = new int[2];
newTextView.getLocationInWindow(startLocation);
final ChannelItem channel = ((DragAdapter) parent.getAdapter()).getItem(position);//获取点击的频道内容
otherAdapter.setVisible(false);
//添加到最后一个
otherAdapter.addItem(channel);
new Handler().postDelayed(new Runnable() {
public void run() {
try {
int[] endLocation = new int[2];
//获取终点的坐标
otherGridView.getChildAt(otherGridView.getLastVisiblePosition()).getLocationInWindow(endLocation);
MoveAnim(moveImageView, startLocation , endLocation, channel,userGridView);
userAdapter.setRemove(position);
} catch (Exception localException) {
}
}
}, 50L);
}
}
break;
case R.id.otherGridView:
final ImageView moveImageView = getView(view);
if (moveImageView != null){
TextView newTextView = (TextView) view.findViewById(R.id.text_item);
final int[] startLocation = new int[2];
newTextView.getLocationInWindow(startLocation);
final ChannelItem channel = ((OtherAdapter) parent.getAdapter()).getItem(position);
userAdapter.setVisible(false);
//添加到最后一个
userAdapter.addItem(channel);
new Handler().postDelayed(new Runnable() {
public void run() {
try {
int[] endLocation = new int[2];
//获取终点的坐标
userGridView.getChildAt(userGridView.getLastVisiblePosition()).getLocationInWindow(endLocation);
MoveAnim(moveImageView, startLocation , endLocation, channel,otherGridView);
otherAdapter.setRemove(position);
} catch (Exception localException) {
}
}
}, 50L);
}
break;
default:
break;
}
}
/**
* 点击ITEM移动动画
* @param moveView
* @param startLocation
* @param endLocation
* @param moveChannel
* @param clickGridView
*/
private void MoveAnim(View moveView, int[] startLocation,int[] endLocation, final ChannelItem moveChannel,
final GridView clickGridView) {
int[] initLocation = new int[2];
//获取传递过来的VIEW的坐标
moveView.getLocationInWindow(initLocation);
//得到要移动的VIEW,并放入对应的容器中
final ViewGroup moveViewGroup = getMoveViewGroup();
final View mMoveView = getMoveView(moveViewGroup, moveView, initLocation);
//创建移动动画
TranslateAnimation moveAnimation = new TranslateAnimation(
startLocation[0], endLocation[0], startLocation[1],
endLocation[1]);
moveAnimation.setDuration(300L);//动画时间
//动画配置
AnimationSet moveAnimationSet = new AnimationSet(true);
moveAnimationSet.setFillAfter(false);//动画效果执行完毕后,View对象不保留在终止的位置
moveAnimationSet.addAnimation(moveAnimation);
mMoveView.startAnimation(moveAnimationSet);
moveAnimationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
isMove = true;
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
moveViewGroup.removeView(mMoveView);
// instanceof 方法判断2边实例是不是一样,判断点击的是DragGrid还是OtherGridView
if (clickGridView instanceof DragGrid) {
otherAdapter.setVisible(true);
otherAdapter.notifyDataSetChanged();
userAdapter.remove();
}else{
userAdapter.setVisible(true);
userAdapter.notifyDataSetChanged();
otherAdapter.remove();
}
isMove = false;
}
});
}
/**
* 获取移动的VIEW,放入对应ViewGroup布局容器
* @param viewGroup
* @param view
* @param initLocation
* @return
*/
private View getMoveView(ViewGroup viewGroup, View view, int[] initLocation) {
int x = initLocation[0];
int y = initLocation[1];
viewGroup.addView(view);
LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
mLayoutParams.leftMargin = x;
mLayoutParams.topMargin = y;
view.setLayoutParams(mLayoutParams);
return view;
}
/**
* 创建移动的ITEM对应的ViewGroup布局容器
*/
private ViewGroup getMoveViewGroup() {
ViewGroup moveViewGroup = (ViewGroup) getWindow().getDecorView();
LinearLayout moveLinearLayout = new LinearLayout(this);
moveLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
moveViewGroup.addView(moveLinearLayout);
return moveLinearLayout;
}
/**
* 获取点击的Item的对应View,
* @param view
* @return
*/
private ImageView getView(View view) {
view.destroyDrawingCache();
view.setDrawingCacheEnabled(true);
Bitmap cache = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
ImageView iv = new ImageView(this);
iv.setImageBitmap(cache);
return iv;
}
/** 退出时候保存选择后数据库的设置 */
private void saveChannel() {
ChannelManage.getManage(AppApplication.getApp().getSQLHelper()).deleteAllChannel();
ChannelManage.getManage(AppApplication.getApp().getSQLHelper()).saveUserChannel(userAdapter.getChannnelLst());
ChannelManage.getManage(AppApplication.getApp().getSQLHelper()).saveOtherChannel(otherAdapter.getChannnelLst());
}
@Override
public void onBackPressed() {
saveChannel();
super.onBackPressed();
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/subscribe_activity_bg" >
<include
android:id="@+id/title_bar"
layout="@layout/title_bar" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/title_bar" >
<LinearLayout
android:id="@+id/subscribe_main_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/subscribe_bg"
android:orientation="vertical"
android:paddingBottom="14.0dip" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:layout_marginTop="14.0dip"
android:gravity="bottom"
android:orientation="horizontal" >
<TextView
android:id="@+id/my_category_text"
style="@style/subscribe_my_tip_text"
android:text="@string/subscribe_my_category" />
<TextView
android:id="@+id/my_category_tip_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12.0dip"
android:text="@string/subscribe_manager_category_info_2"
android:textColor="@color/subscribe_tip_text"
android:textSize="11.0sp" />
</LinearLayout>
<View
android:id="@+id/seperate_line"
style="@style/subscribe_seperate_line" />
<channelmanager.bwie.com.draggridviewlibrary.view.DragGrid
android:id="@+id/userGridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="14dip"
android:layout_marginRight="14dip"
android:gravity="center"
android:horizontalSpacing="14dip"
android:listSelector="@android:color/transparent"
android:numColumns="4"
android:scrollbars="vertical"
android:stretchMode="columnWidth"
android:verticalSpacing="14.0px" ></channelmanager.bwie.com.draggridviewlibrary.view.DragGrid>
<View
android:id="@+id/seperate_line2"
style="@style/subscribe_seperate_line" />
<TextView
android:id="@+id/more_category_text"
style="@style/subscribe_more_tip_text"
android:layout_marginBottom="14.0dip"
android:layout_marginLeft="10.0dip"
android:text="@string/subscribe_more_category" />
<channelmanager.bwie.com.draggridviewlibrary.view.OtherGridView
android:id="@+id/otherGridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="14dip"
android:layout_marginRight="14dip"
android:gravity="center"
android:horizontalSpacing="14dip"
android:listSelector="@android:color/transparent"
android:numColumns="4"
android:scrollbars="vertical"
android:stretchMode="columnWidth"
android:verticalSpacing="14.0px" />
</LinearLayout>
</ScrollView>
<include
android:id="@+id/category_layout"
layout="@layout/subscribe_category_item"
android:visibility="gone" />
</RelativeLayout>
4.清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bwie.channelmanager">
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 震动权限 -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name="channelmanager.bwie.com.draggridviewlibrary.app.AppApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ChannelActivity"></activity>
</application>
</manifest>