文档章节

expandablelistview 的拖拽

SFrancisco
 SFrancisco
发布于 2014/02/11 15:31
字数 3447
阅读 300
收藏 1
package impalamc.android.AndDraw;

import impalamc.android.AndDraw.layout.MyExpandableAdapter;

import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;

public class DragListView extends ExpandableListView {


	private static final String tag = "DragListView";

	// 被拖拽的项,其实就是一个ImageView
	 private ImageView dragImageView;

	 private String moveitem;
	 private String childMoveitem;
	// 手指按下的时候列表项在listview中的位置
	 private int dragPosition;
	// 用于交换列表项用
	 private int savePosition;
	// 手指拖动的时候,当前拖动项在列表中的位置
	 private int movePosition;
	// 在当前数据项中的位置
	 private int dragPoint;
	// 当前视图和屏幕的距离(这里只使用了y方向上)
	 private int dragOffset;
	// windows窗口控制类
	 private WindowManager windowManager;
	// 用于控制拖拽项的显示的参数
	 private WindowManager.LayoutParams windowParams;

	 private ViewGroup itemView;

	 private MyExpandableAdapter mSelectAdapter;

	 private int mEventY = 0;

	 private String mReplaceString = new String();
	 
	 int i =0;
	 
	 private int startPosition;
	 private int endPosition;
	 int[] mStartPosition = new int[2];
	 int[] mEndPosition = new int[2];
	 public static List<String> child;
	 
	 
	 public DragListView(Context context) {
			super(context);
		}
	public DragListView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public void setAdapter(ExpandableListAdapter adapter) {
		super.setAdapter(adapter);
		mSelectAdapter = (MyExpandableAdapter) getExpandableListAdapter();
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {

		if(ev.getAction() == MotionEvent.ACTION_DOWN){
			int x = (int) ev.getX();
			int y = (int) ev.getY();
			dragPosition = pointToPosition(x, y);
			/*
			 * 判断当前x、y的值是否在item上
			 * 如果true :返回修改item的position
			 *  false:返回INVALID_POSITION(-1)
			 */
			if(dragPosition == AdapterView.INVALID_POSITION){
				return super.onInterceptTouchEvent(ev);
			}
			savePosition = dragPosition;
			movePosition = dragPosition;
			
			moveitem = mSelectAdapter.getGroup(dragPosition);
			
			//获取当前点击的view
			itemView = (ViewGroup) getChildAt(dragPosition - getFirstVisiblePosition());
			//点击坐标-- view的上边界
			dragPoint = y-itemView.getTop();
			// 整个屏幕中的y坐标-listview中的y坐标,即偏移量
			dragOffset = (int) (ev.getRawY() - y);
			View dragger = itemView.findViewById(R.id.iv_dragList);
			//判断点击范围的是否是可拖拽的图标的范围
			if(dragger != null && x>dragger.getLeft() && 
					x<dragger.getRight()){
				itemView.setDrawingCacheEnabled(true);
				Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
			    mSelectAdapter.remove(moveitem);
                mSelectAdapter.insert(mReplaceString, dragPosition);
                startDrag(bm,y);
                return true;
			}else{
				return false;
			}
		}
			return false;
		
	}
	
	
	
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		int action = ev.getAction();
		if(dragImageView != null && dragPosition != INVALID_POSITION){
			switch (action) {
			case MotionEvent.ACTION_UP:
				stopDrag();
				insertLastData(movePosition);
				mEventY = 0;
				itemView.destroyDrawingCache();
//				Log.i(tag, "我是up");
				break;
			case MotionEvent.ACTION_MOVE:
//				if(isFirst){
				
//				i++;
//				Log.i(tag, "我是move"+i);
					int moveY = (int) ev.getY();
					mEventY = moveY;
					float rawY = ev.getRawY();
					onDrag(moveY, (int) ev.getRawY());
//				}
				break;
			case MotionEvent.ACTION_DOWN:
				break;	
			}
		}
		
		return super.onTouchEvent(ev);
	}

	public void onDrag(int y, int rawY) {
		//超出上边界,设为最小值位置0
		int scrollY = 0;
		View childAt;
		if(y < 0){
			y = 0;
			scrollY = 30;
		}else if(y > getHeight()){
			y = getHeight();
			scrollY = -30;
		}
		/*
		 * 进行判断 如果超出边界
		 * 则让listview滑动
		 * 其实就是设置位置到超出的地方
		 */
		if(scrollY != 0){
//			Log.i(tag, "y = "+y);
			/*
			 * 有时候getChildAt(dragPosition - getFirstVisiblePosition())会返回空值
			 * 但是不是每次都会返回空值
			 * 大概操作是list向上滚动到顶部时重新向下拖动再向上拖动
			 * 有时候会出现空指针异常
			 * 进行非空判断后还是有时会出现空指针的异常 不知道为什么
			 * 	if(!childAt.equals("") && childAt!= null)此行报错
			 * @ author Lee
			 */
			/*
			 * 写成
			 * View childAt;
			 * childAt = getChildAt(dragPosition - getFirstVisiblePosition());后
			 * 暂时没出现空指针异常
			 */
			childAt = getChildAt(dragPosition - getFirstVisiblePosition());
			Log.i(tag, "childAt = "+childAt);
			if(!childAt.equals("") && childAt!= null){
				int top = childAt.getTop();
//				Log.i(tag, "top = "+top);
//				Log.i(tag, "dragPosition = "+dragPosition);
				setSelectionFromTop(dragPosition, top + scrollY);
			}
		}
		
		postInvalidate();
		if(dragImageView != null){
			windowParams.alpha = 0.8f;
			windowParams.y = rawY - dragPoint;
            windowManager.updateViewLayout(dragImageView, windowParams);
		}
		//为了避免滑动到分割线的时候,返回-1的问题
		int tempPosition = pointToPosition(0, y);
		if(tempPosition != INVALID_POSITION){
			movePosition = tempPosition;
			onDrop(y);
		}
		
		
	}

	
	public void onDrop(int y) {
		//根据拖动的位置在列表中放到相应的位置
		//想下滑
		/*
		 * 不知道什么原因,执行一次下滑操作的时候onTouch里面的move方法会被执行两次
		 * 导致稍快拖动的时候movePositon的值不正确
		 * 但每次下滑都是savePosition+1
		 * 上滑是 savePosition -1
		 * 所以不使用movePosition拖动后顺序就不会乱
		 * 继续研究为什么onTouch 会被执行两次
		 * @author Lee
		 */
		if(movePosition > savePosition){
			ChangeItemDown(savePosition, movePosition);
//            savePosition = movePosition ;
			savePosition = savePosition+1;
           
		}
		//向上
		else if(movePosition < savePosition){
			 ChangeItemUp(savePosition, movePosition);
//	            savePosition = movePosition ;
			 savePosition = savePosition-1;
		}
		
	}
	//向上
	private void ChangeItemUp(int save, int move) {
//		String itemStr = mSelectAdapter.getGroup(move);
//        mSelectAdapter.remove(mSelectAdapter.getGroup(save));
//        mSelectAdapter.remove(itemStr);
//        mSelectAdapter.insert(mReplaceString, move);
//        mSelectAdapter.insert(itemStr, save);
			mSelectAdapter.up(save);
	}
	//向下
	private void ChangeItemDown(int save, int move) {
//		 String itemStr = mSelectAdapter.getGroup(move);
//	        mSelectAdapter.remove(mSelectAdapter.getGroup(save));
//	        mSelectAdapter.remove(itemStr);
//	        mSelectAdapter.insert(itemStr, save);
//	        mSelectAdapter.insert(mReplaceString, move);
//	        mSelectAdapter.ChangeItemDown( save,  move);
	        mSelectAdapter.down(save);
	}

	private void insertLastData(int position) {
		String dragItem = mSelectAdapter.getGroup(position);
		mSelectAdapter.remove(dragItem);
	    mSelectAdapter.insert(moveitem, position);
	}

	/**
	 * 准备拖动,初始化被拖动项的图像
	 * @param bm
	 * @param y
	 */
	public void startDrag(Bitmap bm, int y) {
		stopDrag();
		//创造一个拖动时的虚影
		windowParams = new WindowManager.LayoutParams();
		windowParams.gravity = Gravity.TOP|Gravity.LEFT;
		windowParams.x = 0;
		windowParams.y = y - dragPoint + dragOffset;
		windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
        windowParams.format = PixelFormat.TRANSLUCENT;
        windowParams.windowAnimations = 0;

        ImageView imageView = new ImageView(getContext());
        imageView.setImageBitmap(bm);
        windowManager = (WindowManager) getContext().getSystemService("window");
        windowManager.addView(imageView, windowParams);
        dragImageView = imageView;
	}
	/**
	 * 停止拖动,去掉拖动项的影像
	 */
	public void stopDrag() {
		 if (dragImageView != null) {
	            windowManager.removeView(dragImageView);
	            dragImageView = null;
	            itemView.setBackgroundColor(Color.TRANSPARENT);
	        }
	}
}
adapter 的相关
package impalamc.android.AndDraw.layout;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import impalamc.android.AndDraw.AndDraw;
import impalamc.android.AndDraw.Constants;
import impalamc.android.AndDraw.R;
import impalamc.android.AndDraw.util.AlertUtil;
import impalamc.android.AndDraw.util.FileUtils;
import impalamc.android.AndDraw.util.MyTextWatcher;
import impalamc.android.AndDraw.util.WidgetUtil;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.util.Log;
import android.view.Gravity;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;


    //定义ExpandableListView的Adapter  
public class MyExpandableAdapter extends BaseExpandableListAdapter    
{
	Context context;   
	ViewHolder holder;
	LibAdapter libAdapter;
	public static List<String> groupArray=new ArrayList<String>();          
	public static List<List<String>> childArray=new ArrayList<List<String>>();
    String  mark="";
    private int countGroupPosition = -1;
    private int countChildPosition = -1;
    private boolean isReClick = false;
    ImageView modChiButton;
    ImageView delChiButton;
	
    ImageView modPreButton;
    ImageView delPreButton;
    ImageView addPreButton;
    ImageView dragButton;
    
    
    public MyExpandableAdapter(Context context, List<String> groupArray, List<List<String>> childArray,String mark,LibAdapter libAdapter)    
    {    
        this.context = context;    
        this.groupArray = groupArray;
        this.childArray = childArray;
        this.mark=mark;
        this.libAdapter=libAdapter;
        
        
        groupArray = libAdapter.parentData;
    }  
    
    public void setCountGroupPosition(int countGroupPosition) {
    	isReClick = false;
    	this.countGroupPosition = countGroupPosition;
    	this.notifyDataSetChanged();
    }
    
    public void setCountChildPosition(int countGroupPosition,int countChildPosition) {
    	isReClick = true;
    	this.countGroupPosition = countGroupPosition;
    	this.countChildPosition = countChildPosition;
    	this.notifyDataSetChanged();
    }
	@Override
	public String getChild(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childArray.get(groupPosition).get(childPosition);
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childPosition;
	}

	@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		
		final LayoutInflater inflater = (LayoutInflater) 
		context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.zhr_children, null);
			holder = new ViewHolder();
			holder.cName = (TextView) convertView.findViewById(R.id.zhr_child);
			convertView.setTag(holder);
			
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		
		if ( countGroupPosition != -1  &&  countGroupPosition == groupPosition 
				&& childPosition==0 && isReClick==false) {
			convertView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.tab_orange));
		}else if ( countGroupPosition != -1  &&  countGroupPosition == groupPosition
				&& countChildPosition==childPosition && isReClick==true ) {
			convertView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.tab_orange));
		}else{
			convertView.setBackgroundColor(Color.WHITE);
		}
		
		final int parentP = groupPosition;
		final int childP = childPosition;
		
		final String tempStr = childArray.get(groupPosition).get(childPosition);
		final String groupStr=getGroup(groupPosition).toString();
		holder.cName.setText(tempStr);	
		modChiButton=(ImageView)convertView.findViewById(R.id.children_modify);
		delChiButton=(ImageView)convertView.findViewById(R.id.children_delete);
		if(mark.equals("tuku")){
			modChiButton.setVisibility(View.GONE);
			
			delChiButton.setVisibility(View.GONE);
		}
		if(mark.equals("leibie")){
			
			modChiButton.setVisibility(View.VISIBLE);
			modChiButton.setFocusable(false);
			
			modChiButton.setOnClickListener(new View.OnClickListener(){

				String TAG = "temp";
				@Override
				public void onClick(View v) {

					// TODO Auto-generated method stub
					final View modifyView = inflater.inflate(R.layout.modify_category, null);
					final EditText modifyName = (EditText)modifyView.findViewById(R.id.modify_name);
					modifyName.addTextChangedListener(new MyTextWatcher(context, 21));
//					final TextView nameEdit = holder.cName;
					modifyName.setText(childArray.get(parentP).get(childP));
					AlertDialog.Builder modifyDialog;
					modifyDialog = new AlertDialog.Builder(context);
//					modifyDialog.setTitle("编辑");
//					modifyDialog.setIcon(R.drawable.hisign_icon);
					modifyDialog.setView(modifyView);
					modifyDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
					    public void onClick(DialogInterface mDialog, int id) {
					    	File root = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+groupStr);
							String[] stringlist = root.list();
							List<String> nameList = Arrays.asList(stringlist);
							//点击后并不做修改
							if(childArray.get(parentP).get(childP).equals(modifyName.getText().toString())){
								
							}
							//修改名称与类表中已存在类名相同
							else if(nameList.contains(modifyName.getText().toString())){
								String warning = "不能修改为指定名称,该类别已存在!";
								libAdapter.showAlertDialog(warning,null);
							}
							else if(modifyName.getText()==null||modifyName.getText().toString().replaceAll(" ", "").equals("")){
								String warning = "类别名称不能为空!";
								libAdapter.showAlertDialog(warning,null);
							}
							else{
								File dir = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+groupStr+"/"+childArray.get(parentP).get(childP));
								childArray.get(parentP).set(childP, modifyName.getText().toString());
								if (dir.renameTo(new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+groupStr+"/"+modifyName.getText().toString()))){				
									notifyDataSetChanged();
									AlertUtil.showToast(context,"修改类别:"+childArray.get(parentP).get(childP)+" 成功!");
									libAdapter.InitSubMenu();
								}
								else{
									AlertUtil.showToast(context,"修改类别:"+childArray.get(parentP).get(childP)+" 失败!");
								}
								libAdapter.refreshFlag = 1;
								AndDraw activity = (AndDraw)context;
								activity.baseMenuLayout.setAdapter(libAdapter.self);
								//重新加载类别列表
								libAdapter.initLeftList();
								groupArray = libAdapter.parentData;
								childArray=libAdapter.childData;
								MyExpandableAdapter.this.notifyDataSetChanged();
								mDialog.dismiss();
							}
				     }
				});
					modifyDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
//						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.cancel();
						}
					});
					LinearLayout topLayout = new LinearLayout(context);
					topLayout.setOrientation(LinearLayout.VERTICAL);
					View topShowview = LayoutInflater.from(context).inflate(R.layout.message_title, null);
					topLayout.addView(topShowview,LayoutParams.FILL_PARENT, 60);
					TextView textTitle = (TextView)topShowview.findViewById(R.id.text_title);
					textTitle.setText("编辑");

					modifyDialog.setCustomTitle(topLayout);
					final AlertDialog adl = modifyDialog.create();
					ImageView imageCancle = (ImageView)topShowview.findViewById(R.id.commonlib_return);
					imageCancle.setOnClickListener(new OnClickListener() {
											
					@Override
					public void onClick(View v) {
					// TODO Auto-generated method stub
					adl.dismiss();
					}
					});
					adl.show();
			}
		});
			delChiButton.setVisibility(convertView.VISIBLE);
            delChiButton.setFocusable(false);
            //child
            delChiButton.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					final View tempView=v;
					AlertDialog.Builder mAlertDialog;
					mAlertDialog = new AlertDialog.Builder(context);
//					mAlertDialog.setTitle(Constants.ICON_TITLE);
//					mAlertDialog.setIcon(R.drawable.hisign_icon);
					mAlertDialog.setMessage("确定删除该类别及其包含的所有图元?");
					mAlertDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
					    public void onClick(DialogInterface mAlertDialog, int id) {
					    	childArray.get(parentP).remove(childP);
							notifyDataSetChanged();
					    	File dir = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+groupStr+"/"+tempStr);
							
							File files[] = dir.listFiles();
							
							for(int i=0;i<files.length;i++){            //遍历目录下所有的文件
								
							    files[i].delete();             		//把每个文件 用这个方法进行迭代
							} 
							if (dir.delete()){				
								AlertUtil.showToast(context,"删除类别:"+tempStr+" 成功!");
								libAdapter.InitSubMenu();
							}
							else{
								AlertUtil.showToast(context,"删除类别:"+tempStr+" 失败!");
							}
							libAdapter.refreshFlag = 1;
							AndDraw activity = (AndDraw)context;
							activity.baseMenuLayout.setAdapter(libAdapter.self);
							//重新加载类别列表
							libAdapter.initLeftList();
							groupArray = libAdapter.parentData;
							childArray=libAdapter.childData;
							MyExpandableAdapter.this.notifyDataSetChanged();
					    	mAlertDialog.dismiss();
					    	Constants.refresh = true;
				}
			  });
	        	mAlertDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {  
				    public void onClick(DialogInterface dialog, int id) {  
				    	dialog.cancel();					    	
				    }  
				  }); 
	        	LinearLayout topLayout = new LinearLayout(context);
	        	topLayout.setOrientation(LinearLayout.VERTICAL);
	        	View topShowview = LayoutInflater.from(context).inflate(R.layout.message_title, null);
	        	topLayout.addView(topShowview,LayoutParams.FILL_PARENT, 60);
	        	TextView textTitle = (TextView)topShowview.findViewById(R.id.text_title);
	        	textTitle.setText(Constants.ICON_TITLE);

	        	mAlertDialog.setCustomTitle(topLayout);
	        	final AlertDialog adl = mAlertDialog.create();
	        	ImageView imageCancle = (ImageView)topShowview.findViewById(R.id.commonlib_return);
	        	imageCancle.setOnClickListener(new OnClickListener() {
	        							
	        	@Override
	        	public void onClick(View v) {
	        	// TODO Auto-generated method stub
	        		adl.dismiss();
	        		WidgetUtil.resetItemBackgroundColor(tempView);
	        	}
	        	});
	        	adl.show();	
		}
       });
	}  
		return convertView;
}

	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		return childArray.get(groupPosition).size();
	}

	@Override
	public String getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return groupArray.get(groupPosition);
	}

	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return groupArray.size();
	}

	@Override
	public long getGroupId(int groupPosition) {
		// TODO Auto-generated method stub
		return groupPosition;
	}

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		
		final LayoutInflater inflater = (LayoutInflater) 
		context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		final int parentP=groupPosition;
		View view = convertView;
		if (view == null) {
			view = inflater.inflate(R.layout.parent, null);
		}
		
		if ( countGroupPosition != -1  &&  countGroupPosition == groupPosition 
				&& isReClick==false && isExpanded == true && getChildrenCount(groupPosition) == 0) {
			view.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.tab_orange));
		}else{
			view.setBackgroundColor(Color.WHITE);
		}
		
		TextView title = (TextView) view.findViewById(R.id.parent);
		title.setText(getGroup(groupPosition).toString());		
		modPreButton=(ImageView)view.findViewById(R.id.parent_modify);
		delPreButton=(ImageView)view.findViewById(R.id.parent_delete);
		addPreButton=(ImageView)view.findViewById(R.id.parent_add);
		dragButton=(ImageView)view.findViewById(R.id.iv_dragList);
		//是一个空白 为了在类别里填补空位
		View space = view.findViewById(R.id.space);
		
		if(mark.equals("tuku")){
			modPreButton.setVisibility(view.GONE);
			delPreButton.setVisibility(view.GONE);
			addPreButton.setVisibility(view.GONE);
			dragButton.setVisibility(view.VISIBLE);
			space.setVisibility(view.GONE);
		}
		if(mark.equals("leibie")){
			//设置在类别里面不显示
			dragButton.setVisibility(view.GONE);
			space.setVisibility(view.VISIBLE);
			modPreButton.setVisibility(view.VISIBLE);
			modPreButton.setFocusable(false);
			
			modPreButton.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					final View modifyView = inflater.inflate(R.layout.modify_category, null);
					final EditText modifyName = (EditText)modifyView.findViewById(R.id.modify_name);
					modifyName.addTextChangedListener(new MyTextWatcher(context, 21));
					modifyName.setText(getGroup(parentP).toString());
					AlertDialog.Builder modifyDialog;
					modifyDialog = new AlertDialog.Builder(context);
//					modifyDialog.setTitle("编辑");
//					modifyDialog.setIcon(R.drawable.hisign_icon);
					modifyDialog.setView(modifyView);
					modifyDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
					    public void onClick(DialogInterface mDialog, int id) {
					    	File root = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/");
							String[] stringlist = root.list();
							List<String> nameList = Arrays.asList(stringlist);
							//点击后并不做修改
							if(getGroup(parentP).toString().equals(modifyName.getText().toString())){
								
							}
							//修改名称与类表中已存在类名相同
							else if(nameList.contains(modifyName.getText().toString())){
								String warning = "不能修改为指定名称,该类别已存在!";
								libAdapter.showAlertDialog(warning,null);
							}
							else if(modifyName.getText()==null||modifyName.getText().toString().replaceAll(" ", "").equals("")){
								String warning = "类别名称不能为空!";
								libAdapter.showAlertDialog(warning,null);
							}
							else{
								File dir = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+getGroup(parentP).toString());
					            groupArray.set(parentP, modifyName.getText().toString());
								if (dir.renameTo(new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+modifyName.getText().toString()))){				
									notifyDataSetChanged();
									AlertUtil.showToast(context,"修改类别:"+getGroup(parentP).toString()+" 成功!");
//									libAdapter.InitSubMenu();
								}
								else{
									AlertUtil.showToast(context,"修改类别:"+getGroup(parentP).toString()+" 失败!");
								}
								libAdapter.refreshFlag = 1;
								AndDraw activity = (AndDraw)context;
								activity.baseMenuLayout.setAdapter(libAdapter.self);
								
								//重新加载类别列表
								libAdapter.initLeftList();
								MyExpandableAdapter.this.notifyDataSetChanged();
								
								mDialog.dismiss();
							}
				     }
				});
					modifyDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
//						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.cancel();
						}
					});
					LinearLayout topLayout = new LinearLayout(context);
					topLayout.setOrientation(LinearLayout.VERTICAL);
					View topShowview = LayoutInflater.from(context).inflate(R.layout.message_title, null);
					topLayout.addView(topShowview,LayoutParams.FILL_PARENT, 60);
					TextView textTitle = (TextView)topShowview.findViewById(R.id.text_title);
					textTitle.setText("编辑");

					modifyDialog.setCustomTitle(topLayout);
					final AlertDialog adl = modifyDialog.create();
					ImageView imageCancle = (ImageView)topShowview.findViewById(R.id.commonlib_return);
					imageCancle.setOnClickListener(new OnClickListener() {
											
					@Override
					public void onClick(View v) {
					// TODO Auto-generated method stub
					adl.dismiss();
					}
					});
					adl.show();
					
				}
			});
			
			
            delPreButton.setVisibility(view.VISIBLE);
            delPreButton.setFocusable(false);
            delPreButton.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					final View tempView=v;
					AlertDialog.Builder mAlertDialog;
					mAlertDialog = new AlertDialog.Builder(context);
//					mAlertDialog.setTitle(Constants.ICON_TITLE);
//					mAlertDialog.setIcon(R.drawable.hisign_icon);
					mAlertDialog.setMessage("确定删除该类别及其包含的所有图元?");
					mAlertDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
					    public void onClick(DialogInterface mAlertDialog, int id) {
					    	File dir = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+getGroup(parentP).toString());
							File files[] = dir.listFiles();
							
							for(int i=0;i<files.length;i++){            //遍历目录下所有的文件

								if ( files[i].isDirectory() ) {
									Log.d("temp", "files["+i+"] isDirectory");
									
									File[] tempFiles = files[i].listFiles();
									for ( int j=0; j<tempFiles.length; j++ ) {
										
										tempFiles[j].delete();
									}
									if ( files[i].listFiles().length == 0 )
										files[i].delete();
								}
								else
									files[i].delete();             		//把每个文件 用这个方法进行迭代
							} 
							if (dir.delete()){				
								AlertUtil.showToast(context,"删除类别:"+getGroup(parentP).toString()+" 成功!");
								libAdapter.InitSubMenu();
								libAdapter.initLeftList();
								groupArray = libAdapter.parentData;
								childArray = libAdapter.childData;
								notifyDataSetChanged();
								libAdapter.setItemBackgroundColor(libAdapter.tempView);
							}
							else{
								AlertUtil.showToast(context,"删除类别:"+getGroup(parentP).toString()+" 失败!");
							}
							
							libAdapter.refreshFlag = 1;
							AndDraw activity = (AndDraw)context;
							activity.baseMenuLayout.setAdapter(libAdapter.self);							
					    	mAlertDialog.dismiss();
					    	Constants.refresh = true;
				}
			  });
	        	mAlertDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {  
				    public void onClick(DialogInterface dialog, int id) {  
				    	dialog.cancel();					    	
				    }  
				  }); 
	        	LinearLayout topLayout = new LinearLayout(context);
	        	topLayout.setOrientation(LinearLayout.VERTICAL);
	        	View topShowview = LayoutInflater.from(context).inflate(R.layout.message_title, null);
	        	topLayout.addView(topShowview,LayoutParams.FILL_PARENT, 60);
	        	TextView textTitle = (TextView)topShowview.findViewById(R.id.text_title);
	        	textTitle.setText(Constants.ICON_TITLE);

	        	mAlertDialog.setCustomTitle(topLayout);
	        	final AlertDialog adl = mAlertDialog.create();
	        	ImageView imageCancle = (ImageView)topShowview.findViewById(R.id.commonlib_return);
	        	imageCancle.setOnClickListener(new OnClickListener() {
	        							
	        	@Override
	        	public void onClick(View v) {
	        	// TODO Auto-generated method stub
	        	adl.dismiss();
	        	WidgetUtil.resetItemBackgroundColor(tempView);
	        	}
	        	});
	        	adl.show();
				}
			});
               
            addPreButton.setVisibility(view.VISIBLE);
            addPreButton.setFocusable(false);
            addPreButton.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					final View modifyView = inflater.inflate(R.layout.modify_category, null);
					final EditText modifyName = (EditText)modifyView.findViewById(R.id.modify_name);
					final TextView modifyText = (TextView)modifyView.findViewById(R.id.modify_text);
					modifyText.setText("添加类别");
					modifyName.addTextChangedListener(new MyTextWatcher(context, 21));
					AlertDialog.Builder modifyDialog;
					modifyDialog = new AlertDialog.Builder(context);
//					modifyDialog.setTitle("添加");
//					modifyDialog.setIcon(R.drawable.hisign_icon);
					modifyDialog.setView(modifyView);
					modifyDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
					    public void onClick(DialogInterface mDialog, int id) {
					    	File root = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+getGroup(parentP).toString());
							String[] stringlist = root.list();
							List<String> nameList = Arrays.asList(stringlist);
							//点击后并不做修改
							if(nameList.contains(modifyName.getText().toString())){
								String warning = "该类别已存在,请重新输入类别名称!";
								libAdapter.showAlertDialog(warning,modifyName);
							}else if(modifyName.getText()==null||modifyName.getText().toString().replaceAll(" ", "").equals("")){
								String warning = "类别名称不能为空,请输入类别名称!";
								libAdapter.showAlertDialog(warning,null);
							}
							else if(modifyName.getText()==null||modifyName.getText().toString().replaceAll(" ", "").equals("")){
								String warning = "类别名称不能为空!";
								libAdapter.showAlertDialog(warning,null);
							}
							else{
								childArray.get(parentP).add(modifyName.getText().toString());
								File dir = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+getGroup(parentP).toString()+"/"+modifyName.getText().toString());
								notifyDataSetChanged();
								if (dir.mkdir()){
									AlertUtil.showToast(context, "新建类别:"+modifyName.getText().toString()+" 成功!");
									libAdapter.InitSubMenu();
								}
								else{
									AlertUtil.showToast(context, "新建类别:"+modifyName.getText().toString()+" 失败!");
								}
								libAdapter.refreshFlag = 1;
								AndDraw activity = (AndDraw)context;
								activity.baseMenuLayout.setAdapter(libAdapter.self);
								//重新加载类别列表
								libAdapter.initLeftList();
								groupArray = libAdapter.parentData;
								childArray=libAdapter.childData;
								MyExpandableAdapter.this.notifyDataSetChanged();
								mDialog.dismiss();
							}
				     }
				});
					modifyDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
//						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.cancel();
						}
					});
					LinearLayout topLayout = new LinearLayout(context);
					topLayout.setOrientation(LinearLayout.VERTICAL);
					View topShowview = LayoutInflater.from(context).inflate(R.layout.message_title, null);
					topLayout.addView(topShowview,LayoutParams.FILL_PARENT, 60);
					TextView textTitle = (TextView)topShowview.findViewById(R.id.text_title);
					textTitle.setText("添加");

					modifyDialog.setCustomTitle(topLayout);
					final AlertDialog adl = modifyDialog.create();
					ImageView imageCancle = (ImageView)topShowview.findViewById(R.id.commonlib_return);
					imageCancle.setOnClickListener(new OnClickListener() {
											
					@Override
					public void onClick(View v) {
					// TODO Auto-generated method stub
					adl.dismiss();
					}
					});
					adl.show();
				}
			});
            
		}
		return view;
	}
	
	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return true;
	}    
	static class ViewHolder {
		TextView cName;
	}
	public void remove(String moveitem) {
		// TODO Auto-generated method stub
		groupArray.remove(moveitem);
		
		this.notifyDataSetChanged();
	}
	public void insert(String mReplaceString, int dragPosition) {
		// TODO Auto-generated method stub
		groupArray.add(dragPosition, mReplaceString);
		this.notifyDataSetChanged();
	}

	public void updateData(List<String> mCodeData) {
		// TODO Auto-generated method stub
		groupArray = mCodeData;
		 this.notifyDataSetChanged();
	}
	
	 public void up(int position) {
         if (position == 0)
             return;
         String codeUpData = groupArray.get(position);
         String codeDownData = groupArray.get(position - 1);
         groupArray.set(position, codeDownData);
         groupArray.set(position - 1, codeUpData);
         
        List<String> clist = childArray.get(position);
         List<String> cdlist = childArray.get(position-1);
         
         childArray.set(position, cdlist);
         childArray.set(position-1, clist);
         
         
         saveDate();
         
         this.notifyDataSetChanged();
     }
	 /**
	  * 保存数据的方法
	  */
	private void saveDate() {
		LibAdapter.parentData = groupArray;
         LibAdapter.childData = childArray;
	}

     public void down(int position) {
         if (position == groupArray.size() - 1)
             return;
         //获得初始位置的值
         String codeDownData = groupArray.get(position);
         //获得初始位置下一个位置的值
         String codeUpData = groupArray.get(position + 1);
         //把初始位置下一个的值放到初始位置上
         groupArray.set(position, codeUpData);
         //把初始位置的值放到初始位置下一个位置上
         groupArray.set(position + 1, codeDownData);
         
         
         List<String> clist = childArray.get(position);
         List<String> cdlist = childArray.get(position+1);
         
         childArray.set(position, cdlist);
         childArray.set(position+1, clist);
         
         saveDate();
         
         this.notifyDataSetChanged();
     }

     public void deleteItem(int position) {
         if (position > groupArray.size() - 1)
             return;
         groupArray.remove(position);
         this.notifyDataSetChanged();
     }

     public void deleteAll() {
    	 groupArray.clear();
         this.notifyDataSetChanged();
     }
	
     

	  /*
	   * 初始化左侧列表
	   */
	public void initLeftList(){
		int i;
		File root;
		List<File> catelogFileList = new ArrayList<File>();
		catelogFileList.removeAll(catelogFileList);

		groupArray.removeAll(groupArray);
		childArray.removeAll(childArray);
		
		File catelog = new File(android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/");
		File[] cfList = catelog.listFiles();
		
		for (i=0;i<cfList.length;i++){
			catelogFileList.add(cfList[i]);
		}

												
		for (i=0;i<catelogFileList.size();i++)
		{
			String path = catelogFileList.get(i).getName();
			groupArray.add(path);				
			
		}  				 
		for(int index = 0; index <groupArray.size(); ++index)    
		{   
			List<String> tempArray = new ArrayList<String>(); 
			String path = android.os.Environment.getExternalStorageDirectory()+"/AndDraw/Lib/"+groupArray.get(index);
		
			File childroot = new File(path);
			 File[] filelist = FileUtils.listSortedFiles(childroot);
			root = new File(path);
			filelist = root.listFiles();//得到所有子目录或文件,
			for(int j=0; j<filelist.length; j++ ){
				String myfilename=filelist[j].getName();//得到文件名称				
				if(!"jpg".equals(myfilename.substring(myfilename.lastIndexOf(".")+1,myfilename.length()))&&!"and".equals(myfilename.substring(myfilename.lastIndexOf(".")+1,myfilename.length()))){
					tempArray.add(myfilename);
				}else{
					tempArray.clear();
				}
			}
			childArray.add(tempArray);    
		}  
	}

	/**
	 * 开始的拖动代码,但不知道为什么在move方法里面会执行两次导致传进来的
	 * save move 值不正确,继续调研。
	 * @param save
	 * @param move
	 */
//	public void ChangeItemDown(int save, int move) {
//		String sString = groupArray.get(save);
//		String mString = groupArray.get(move);
//		
//		groupArray.remove(sString);
//		groupArray.remove(mString);
//		
//		groupArray.add(save, mString);
//		groupArray.add(move, sString);
//		
//		LibAdapter.parentData = groupArray;
//		
//		Log.i("LEO","ChangeItemDown::"+ LibAdapter.libAdapter.parentData.get(0));
//		
//		List<String> slist = childArray.get(save);
//		List<String> mlist = childArray.get(move);
//		
//		childArray.remove(mlist);
//		childArray.remove(slist);
//		
//		childArray.add(save, mlist);
//		childArray.add(move,slist);
//		
//		LibAdapter.childData = childArray;
//		
//		this.notifyDataSetChanged();
//	}
}


© 著作权归作者所有

共有 人打赏支持
SFrancisco
粉丝 0
博文 1
码字总数 3447
作品 0
海淀
程序员
私信 提问
加载中

评论(3)

SFrancisco
SFrancisco

引用来自“gegelinfeng”的评论

你这代码不全啊
全了 listview adapter都有 就是拖动换位
gegelinfeng
gegelinfeng
你这代码不全啊
gegelinfeng
gegelinfeng
你好,你做的是什么拖动效果啊
安卓组件控件

ExpandableListView一点点 学习ExpandableListView简单用法 FloatingDragButton:炫酷的拖拽浮动按钮 IOS的Assistive Touch效果很炫酷,可以任意拖拽,同时点击后会展开菜单栏。然而,这不只...

掘金官方
2017/12/15
0
0
Android列表,嵌套滑动

仿淘宝、京东拖拽商品详情(可嵌套ViewPager、ListView、WebView、FragmentTabhost) 对于电商App,商品详情无疑是很重要的一个模块,观察主流购物App的详情界面,发现大部分都是做成了上下两部...

掘金官方
2017/12/15
0
0
网站布局拖拽实现的疑问

我想实现如下拖拽效果,那么怎么样保存数据库呢? 1,用户可以自己设计html模板。然后制定:拖拽区域(如)无限制个数。 2,然后通过程序(php)读出这些拖拽区。在编辑界面时候,可以往这些...

落舞者
2013/07/10
668
5
Android 用户界面---拖放(Drag and Drop)(一)

用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中。这个框架包括:拖拽事件类、拖拽监听器、以及辅助的方法和类。 尽管这个...

长平狐
2012/10/16
149
0
HTML5拖拽API实现vue树形拖拽组件

因业务场景需要一个可拖拽修改节点位置的树形组件,因此动手撸了一个,乘此机会摸了一把html5原生拖拽。近期有时间将核心部分代码抽出,简单说下实现方式。 1.树形结构-组件递归使用 树形结构...

花卷爱学习
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
今天
6
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
6
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
10
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部