public class DragableGridLayout extends GridLayout implements View.OnLongClickListener,View.OnDragListener { private int columCount = 3; private int margin = 20; //设置被推拽的条目 private View mDragView; //设置GridView 是否能推拽 private boolean mIsDragable; public DragableGridLayout(Context context) { this(context,null); } public DragableGridLayout(Context context, AttributeSet attrs) { this(context, attrs,0); } public DragableGridLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { //GridView 列数 setColumnCount(columCount); //GridView 添加或者删除条目的过度动画 setLayoutTransition(new LayoutTransition()); } //向GridView添加 条目 public void setItems(List<String>stringList){ for(String str : stringList){ addItems(str); } } public void addItems(String str) { TextView tv = new TextView(getContext()); tv.setText(str); //设置文字居中 tv.setGravity(Gravity.CENTER); //设置内边距 tv.setPadding(0,10,0,10); GridLayout.LayoutParams params = new GridLayout.LayoutParams(); //设置控件平均分配 params.width = getResources().getDisplayMetrics().widthPixels / columCount - margin * 2; params.height = LayoutParams.WRAP_CONTENT; // params.setMargins(margin,10,margin,10); //设置给 TextView tv.setLayoutParams(params); //给文字设置边框 tv.setBackgroundResource(R.drawable.biankuang2); //添加到View addView(tv); if(mIsDragable){ // 监听 tv.setOnLongClickListener(this); }else{ // 不监听 tv.setOnLongClickListener(null); } if(mIsDragable){ tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //可拖拽的GridLayout 就删除条目,不可推拽的GridLayout 就添加删除的条目 if(mItemClickListenner != null){ mItemClickListenner.onDragItemClick(v); } } }); }else{ tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //不可拖拽的 GridLayout 就删除条目,可推拽的 GridLayout 就添加删除的条目 if(mItemClickListenner != null){ mItemClickListenner.onDisDragItemClick(v); } } }); } } private onItemClickListenner mItemClickListenner; //接口传值 public interface onItemClickListenner{ public void onDragItemClick(View view); public void onDisDragItemClick(View view); } public void setOnItemClickListenner(onItemClickListenner listenner){ this.mItemClickListenner = listenner; } @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()){ case DragEvent.ACTION_DRAG_LOCATION: int itemIndex = getIndex(event); if (itemIndex > -1 && mDragView != null && mDragView != getChildAt(itemIndex)) { removeView(mDragView); addView(mDragView, itemIndex); } break; case DragEvent.ACTION_DRAG_STARTED: initRects(); break; } return true; } //判断当前被拖拽的条目是否进入到了某个条目范围内,进入了就返回进入到的那个条目的索引值 //没进入的话返回-1 private int getIndex(DragEvent event) { for (int i = 0; i < rects.length; i++) { if (rects[i].contains((int) event.getX(), (int) event.getY())) { return i; } } return -1; } //将所有的条目都封装成矩形对象 private Rect[] rects; private void initRects() { int childCount = getChildCount(); rects = new Rect[childCount]; for (int i = 0; i < childCount; i++) { View itemView = getChildAt(i); Rect rect = new Rect(itemView.getLeft(), itemView.getTop(), itemView.getRight(), itemView.getBottom()); rects[i] = rect; } } private boolean isPanDuan; public void setPanDuan(boolean isPanDuan){ this.isPanDuan = isPanDuan; } @Override public boolean onLongClick(View v) { if(isPanDuan) { mDragView = v; //设置拖动监听 v.startDrag(null, new DragShadowBuilder(v), null, 0); } return false; } public void setDragable(boolean isDragable){ this.mIsDragable = isDragable; if(mIsDragable){ setOnDragListener(this); }else{ setOnDragListener(null); } } }
在MainActivity中实现自定义的Viewprivate DragableGridLayout mDragLayout, mDisDragLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDragLayout = findViewById(R.id.drable_grid1);
mDisDragLayout = findViewById(R.id.disdrable_grid1);
initData();
}
private List<String> list1;
private List<String> list2;
private void initData() {
mDragLayout.setDragable(true);
list1 = new ArrayList<String>();
list1.add("精选条目");
list1.add("八达岭");
list1.add("泰山");
list1.add("黄山");
list1.add("凤凰古城");
list1.add("张家界");
list1.add("峨眉山");
mDragLayout.setItems(list1);
mDisDragLayout.setDragable(false);
list2 = new ArrayList<String>();
list2.add("中央电视台");
list2.add("嵩山少林寺");
list2.add("天山");
list2.add("长城");
list2.add("龙虎山");
list2.add("黄果树瀑布");
list2.add("乐山");
mDisDragLayout.setItems(list2);
mDragLayout.setOnItemClickListenner(new DragableGridLayout.onItemClickListenner() {
@Override
public void onDragItemClick(View view) {
if (view instanceof TextView) {
String text = ((TextView) view).getText().toString();
for (int i = 0; i < list1.size(); i++) {
if (list1.get(i).equals(text)) {
if (list1.size() > 4) {
mDragLayout.removeView(view);
list1.remove(i);
list2.add(text);
mDisDragLayout.addItems(text);
}
}
}
}
}
@Override
public void onDisDragItemClick(View view) {
}
});
mDisDragLayout.setOnItemClickListenner(new DragableGridLayout.onItemClickListenner() {
@Override
public void onDragItemClick(View view) {
}
@Override
public void onDisDragItemClick(View view) {
if (view instanceof TextView) {
String text = ((TextView) view).getText().toString();
for (int i = 0; i < list2.size(); i++) {
if (list2.get(i).equals(text)) {
list1.add(text);
list2.remove(i);
mDisDragLayout.removeView(view);
mDragLayout.addItems(text);
}
}
}
}
});
}
实现这个功能遇到了很多问题
1.重复的条目
2.添加后无法刷新
3.数据不匹配
4.重复删除
在这里我们实现的是一个死的数据,下篇博客会上传一片完整的 TabLayout+ViewPager+自定义View+Fragment复用