1. 程式人生 > >Android 自定義View 滑動標籤_At_Swim

Android 自定義View 滑動標籤_At_Swim






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中實現自定義的View
 private 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複用