Bläddra i källkod

1.修改CommonEditor Android,增加Enum选择和排序。

Pen Li 8 år sedan
förälder
incheckning
bc934cd8f9

+ 5 - 1
RedAnt Mobile/app/src/main/AndroidManifest.xml

@@ -225,7 +225,11 @@
             android:name="com.usai.redant.Search.RamSearchActivity"
             android:theme="@style/Theme.AppCompat.Light">
         </activity>
-        <activity android:name="com.usai.redant.Search.RamSearchSettingActivity"
+        <activity
+            android:name="com.usai.redant.Search.RamSearchSettingActivity"
+            android:theme="@style/Theme.AppCompat.Light">
+        </activity>
+        <activity android:name="com.usai.redant.CommonEditor.EnumSelectAndSort.EnumSelectAndSortActivity"
                   android:theme="@style/Theme.AppCompat.Light">
         </activity>
     </application>

+ 2 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditorActivity.java

@@ -45,6 +45,7 @@ import com.usai.redant.CommonEditor.CommonEditor.CommonEditorSectionHeaderHolder
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorSignatureCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorSwitchCellHolder;
 import com.usai.redant.CommonEditor.CommonEditor.CommonEditorTextViewCellHolder;
+import com.usai.redant.CommonEditor.EnumSelectAndSort.EnumSelectAndSortActivity;
 import com.usai.redant.redantmobile.R;
 import com.usai.redant.util.Network;
 
@@ -2115,6 +2116,7 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
                     boolean singleSelect = single_select.toLowerCase().equals("true");
                     String cadedate_str = cadedate_json.toString();
                     intent = new EnumSlectActivity.Builder().build(mCtx,title,max_select,groupPosition,childPosition,cadedate_str,singleSelect,true);
+//                    intent = new EnumSelectAndSortActivity.Builder().build(mCtx,title,max_select,groupPosition,childPosition,cadedate_str,singleSelect,true);
                     request_code = 10;
 
                 } // enum

+ 341 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/EnumSelectAndSort/DragListView.java

@@ -0,0 +1,341 @@
+package com.usai.redant.CommonEditor.EnumSelectAndSort;
+
+import com.usai.redant.redantmobile.R;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.PixelFormat;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+
+public class DragListView extends ListView
+{
+
+	private ImageView dragImageView;// ����ק�����ʵ����һ��ImageView
+	private int dragSrcPosition;// ��ָ�϶���ԭʼ���б��е�λ��
+	private int dragPosition;// ��ָ�϶���ʱ�򣬵�ǰ�϶������б��е�λ��
+
+	private int dragPoint;// �ڵ�ǰ������е�λ��
+	private int dragOffset;// ��ǰ��ͼ����Ļ�ľ���(����ֻʹ����y������)
+
+	private WindowManager windowManager;// windows���ڿ�����
+	private WindowManager.LayoutParams windowParams;// ���ڿ�����ק�����ʾ�IJ���
+
+	private int scaledTouchSlop;// �жϻ�����һ������
+	private int upScrollBounce;// �϶���ʱ�򣬿�ʼ���Ϲ����ı߽�
+	private int downScrollBounce;// �϶���ʱ�򣬿�ʼ���¹����ı߽�
+
+	public boolean canDrag = true;
+
+	public DragListView(Context context) {
+		this(context,null);
+	}
+
+	public DragListView(Context context, AttributeSet attrs) {
+		this(context, attrs,0);
+	}
+
+	public DragListView(Context context, AttributeSet attrs, int defStyleAttr) {
+
+		super(context, attrs,defStyleAttr);
+		scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+
+		this.setOnItemClickListener(mItemClickListenter);
+
+	}
+
+	private int lastClickId = -1;
+	private long lastClickTime;
+	private OnItemClickListener mItemClickListenter = new OnItemClickListener()
+	{
+		public void onItemClick(AdapterView<?> parent, View v, int pos, long id)
+		{
+			DragListAdapter adapter = (DragListAdapter) ((ListView) parent)
+					.getAdapter();
+
+			if (adapter.isEnabled(pos) == false)// return if item is a group key
+				return;
+
+			Object dclickitem = getAdapter().getItem(pos);
+
+			// �����˫��,1�����������ж�Ϊ˫��
+			if (pos == lastClickId
+					&& (Math.abs(lastClickTime - System.currentTimeMillis()) < 1000))
+			{
+				lastClickId = -1;
+				lastClickTime = 0;
+				if (pos < adapter.switchpos())
+				{
+					adapter.remove(dclickitem);
+					adapter.insert(dclickitem, adapter.getCount());
+				}
+				else
+				{
+					adapter.remove(dclickitem);
+					adapter.insert(dclickitem, 1);
+
+				}
+				adapter.notifyDataSetChanged();
+
+			}
+			else
+			{
+				lastClickId = pos;
+				lastClickTime = System.currentTimeMillis();
+			}
+		}
+	};
+
+	// ����touch�¼�����ʵ���Ǽ�һ�����
+	@Override
+	public boolean onInterceptTouchEvent(MotionEvent ev)
+	{
+		if (ev.getAction() == MotionEvent.ACTION_DOWN)
+		{
+			int x = (int) ev.getX();
+			int y = (int) ev.getY();
+
+			dragSrcPosition = dragPosition = pointToPosition(x, y);
+			if (dragPosition == AdapterView.INVALID_POSITION)
+			{
+				return super.onInterceptTouchEvent(ev);
+			}
+
+			ViewGroup itemView = (ViewGroup) getChildAt(dragPosition
+					- getFirstVisiblePosition());
+			dragPoint = y - itemView.getTop();
+			dragOffset = (int) (ev.getRawY() - y);
+
+			View dragger = itemView.findViewById(R.id.drag_list_item_image);
+			if (dragger != null && x > dragger.getLeft() - 20)
+			{
+				//
+				upScrollBounce = Math.min(y - scaledTouchSlop, getHeight() / 3);
+				downScrollBounce = Math.max(y + scaledTouchSlop,
+						getHeight() * 2 / 3);
+
+				itemView.setDrawingCacheEnabled(true);
+				Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
+				itemView.setDrawingCacheEnabled(false);// 清除缓存,否则后面会看到
+				startDrag(bm, y);
+			}
+			return false;
+		}
+		return super.onInterceptTouchEvent(ev);
+	}
+
+	private boolean moved = false;
+	/**
+	 * �����¼�
+	 */
+	@Override
+	public boolean onTouchEvent(MotionEvent ev)
+	{
+
+		if (!canDrag) {
+
+			return super.onTouchEvent(ev);
+		}
+
+		if (dragImageView != null && dragPosition != INVALID_POSITION)
+		{
+			int action = ev.getAction();
+			switch (action)
+			{
+			case MotionEvent.ACTION_UP:
+				if (moved) {
+					int upY = (int) ev.getY();
+					stopDrag();
+					onDrop(upY);
+					moved = false;
+				}
+				break;
+			case MotionEvent.ACTION_MOVE:
+				moved = true;
+				int moveY = (int) ev.getY();
+				onDrag(moveY);
+				break;
+			default:
+				break;
+			}
+			return true;
+		}
+		// Ҳ������ѡ�е�Ч��
+		return super.onTouchEvent(ev);
+	}
+
+	/**
+	 * ׼���϶�����ʼ���϶����ͼ��
+	 * 
+	 * @param bm
+	 * @param y
+	 */
+	public void startDrag(Bitmap bm, int y)
+	{
+		stopDrag();
+
+		windowParams = new WindowManager.LayoutParams();
+		windowParams.gravity = Gravity.TOP;
+		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(Context.WINDOW_SERVICE);
+		windowManager.addView(imageView, windowParams);
+		dragImageView = imageView;
+	}
+
+	/**
+	 * ֹͣ�϶���ȥ���϶����ͷ��
+	 */
+	public void stopDrag()
+	{
+		if (dragImageView != null)
+		{
+			windowManager.removeView(dragImageView);
+			dragImageView = null;
+		}
+	}
+
+	/**
+	 * �϶�ִ�У���Move������ִ��
+	 * 
+	 * @param y
+	 */
+	public void onDrag(int y)
+	{
+		if (dragImageView != null)
+		{
+			windowParams.alpha = 0.8f;
+			windowParams.y = y - dragPoint + dragOffset;
+			windowManager.updateViewLayout(dragImageView, windowParams);
+		}
+		// Ϊ�˱��⻬�����ָ��ߵ�ʱ�򣬷���-1������
+		int tempPosition = pointToPosition(0, y);
+		if (tempPosition != INVALID_POSITION)
+		{
+			dragPosition = tempPosition;
+		}
+
+		// ����
+		int scrollHeight = 0;
+		if (y < upScrollBounce)
+		{
+			scrollHeight = 8;// �������Ϲ���8�����أ����������Ϲ����Ļ�
+		}
+		else
+			if (y > downScrollBounce)
+			{
+				scrollHeight = -8;// �������¹���8�����أ������������Ϲ����Ļ�
+			}
+
+		if (scrollHeight != 0)
+		{
+			// ����������setSelectionFromTop()
+			setSelectionFromTop(dragPosition,
+					getChildAt(dragPosition - getFirstVisiblePosition())
+							.getTop() + scrollHeight);
+		}
+	}
+
+	/**
+	 * �϶����µ�ʱ��
+	 * 
+	 * @param y
+	 */
+	public void onDrop(int y)
+	{
+
+		// Ϊ�˱��⻬�����ָ��ߵ�ʱ�򣬷���-1������
+		int tempPosition = pointToPosition(0, y);
+		if (tempPosition != INVALID_POSITION)
+		{
+			dragPosition = tempPosition;
+		}
+
+		// �����߽紦��
+		if (y < getChildAt(1).getTop())
+		{
+			// �����ϱ߽�
+			dragPosition = 1;
+		}
+		else
+			if (y > getChildAt(getChildCount() - 1).getBottom())
+			{
+				// �����±߽�
+				dragPosition = getAdapter().getCount() - 1;
+			}
+
+		// ��ݽ���
+		if (dragPosition > 0 && dragPosition < getAdapter().getCount())
+		{
+			/* @SuppressWarnings("unchecked") */
+			DragListAdapter adapter = (DragListAdapter) getAdapter();
+			Object dragItem = adapter.getItem(dragSrcPosition);
+			adapter.remove(dragItem);
+			adapter.insert(dragItem, tempPosition); // dragSrcPosition 存在的问题:1 -> 0不能移动
+
+
+			adapter.notifyDataSetChanged();;
+		}
+
+	}
+
+	public static class DragListAdapter extends BaseAdapter {
+
+		@Override
+		public int getCount() {
+			return 0;
+		}
+
+		@Override
+		public Object getItem(int i) {
+			return null;
+		}
+
+		@Override
+		public long getItemId(int i) {
+			return 0;
+		}
+
+		@Override
+		public View getView(int i, View view, ViewGroup viewGroup) {
+			return null;
+		}
+
+		public void insert(Object object,int position) {
+
+		}
+
+		public void remove(Object object) {
+
+		}
+
+		public int switchpos() {
+//			for (int i = 1; i < getCount(); i++)
+//			{
+//				if (getItem(i)._id < 0)
+//					return i;
+//			}
+			return -1;
+		}
+	}
+}

+ 643 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/EnumSelectAndSort/EnumSelectAndSortActivity.java

@@ -0,0 +1,643 @@
+package com.usai.redant.CommonEditor.EnumSelectAndSort;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.usai.redant.CommonEditor.EnumSlectActivity;
+import com.usai.redant.redantmobile.R;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.Serializable;
+
+public class EnumSelectAndSortActivity extends AppCompatActivity {
+
+
+    static String MAX_SELECT = "max_select";
+    static String GROUP_POSITION = "group";
+    static String CHILD_POSITION = "child";
+    static String CADEDATE = "cadedate";
+    static String SINGLE_SELECT = "single_select";
+    static String TITLE = "title";
+    static String AUTO_CLOSE = "auto_close";
+
+    public static class Builder {
+        public Intent build(Context context, String title, int max_select, int group, int child, String cadedate, boolean single_select, boolean auto_close) {
+            if (context == null) {
+                return null;
+            }
+
+            Intent intent = new Intent(context,EnumSelectAndSortActivity.class);
+
+            intent.putExtra(MAX_SELECT,max_select);
+            intent.putExtra(GROUP_POSITION,group);
+            intent.putExtra(CHILD_POSITION,child);
+            if (cadedate != null) {
+                intent.putExtra(CADEDATE,(Serializable) cadedate);
+            }
+            intent.putExtra(SINGLE_SELECT,single_select);
+            if (title != null) {
+                intent.putExtra(TITLE,title);
+            }
+            intent.putExtra(AUTO_CLOSE,auto_close);
+
+            return intent;
+        }
+    }
+
+    public class SearchBarWatcher implements TextWatcher {
+
+        Context mCtx;
+        EditText textView;
+
+        public SearchBarWatcher(Context ctx,EditText textView) {
+            this.mCtx = ctx;
+            this.textView = textView;
+
+
+        }
+
+        String origin_text;
+        String string;
+        int start_position;
+        int change_length; // 修改原文长度
+        int new_string_length;
+
+
+        /**
+         * s        改变前的内容
+         * start    增加内容前光标位置,删除内容后光标位置 (起始位置)
+         * count    选中s中的内容长度(发生改变的原内容长度),未选中为0
+         * after    新添加的内容长度,删除为0
+         * */
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+//            Log.d("TextChange", "before Text Changed: " + s + " Start: " + start + " Count: " + count + " After: " + after);
+
+            origin_text = s.toString();
+            start_position = start;
+            change_length = count;
+            new_string_length = after;
+        }
+
+        /**
+         * s        改变后的内容
+         * start    增加内容前光标位置,删除内容后光标位置 (起始位置)
+         * before   选中s中的内容长度(发生改变的原内容长度),未选中为0
+         * count    增加内容长度,删除内容为0
+         * */
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+//            Log.d("TextChange", "on Text Changed: " + s + " Start: " + start + " Before: " + before + " Count: " + count);
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+
+            /**
+             * 文本处理
+             * */
+            if (new_string_length == 0) {
+                string = "";
+            } else {
+                string = s.toString().substring(start_position,start_position + new_string_length);
+            }
+
+            if (change_length == 0) { // 新加内容
+
+            } else { // 替换原文或删除原文
+
+            }
+
+            /**
+             * 业务逻辑
+             * */
+
+            if (string.equals("\n") || string.equals("\r") || string.equals("\r\n")) {
+                textView.setText(origin_text);
+                return;
+            }
+
+            mKeywords = s.toString();
+            adapter.notifyDataSetChanged();
+
+            if (mKeywords.isEmpty()) {
+                enum_list_view.canDrag =  true;
+            } else {
+                enum_list_view.canDrag = false;
+            }
+
+        }
+    }
+
+
+
+
+    private int maxSelect;
+    private int mGroup;
+    private int mChild;
+    private boolean mSingleSelect;
+    private String mTitle;
+    private boolean mAuto_close;
+    private JSONObject mCadedate;
+    private boolean mDirty;
+
+    private String mKeywords;
+    private int filter_count;
+
+    private DragListView enum_list_view;
+    private EnumAdapter adapter;
+    private Context mCtx;
+
+    private EditText searchBar;
+//    private boolean isEditing = false;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_enum_select_and_sort);
+
+        init();
+
+        setTitle(mTitle);
+
+        searchBar = (EditText)findViewById(R.id.common_editor_enum_select_sort_search_bar);
+        searchBar.addTextChangedListener(new SearchBarWatcher(mCtx,searchBar));
+
+        enum_list_view = (DragListView) findViewById(R.id.enum__select_sort_list_view);
+
+        adapter = new EnumAdapter(mCtx);
+        enum_list_view.setAdapter(adapter);
+
+        enum_list_view.setOnItemClickListener(new CellClickListener(mCtx));
+
+    }
+
+//    @Override
+//    public boolean onCreateOptionsMenu(Menu menu) {
+//        getMenuInflater().inflate(R.menu.enum_select_sort_menu,menu);
+//        return true;
+//    }
+//
+//    @Override
+//    public boolean onOptionsItemSelected(MenuItem item) {
+//
+////        if (item.getItemId() == R.id.enum_menu_sort) {
+////            if (isEditing) {
+////                isEditing = false;
+////                item.setTitle("Sort");
+////            } else {
+////                isEditing = true;
+////                item.setTitle("End Sort");
+////            }
+////
+////            adapter.notifyDataSetChanged();
+////        }
+//        return true;
+//    }
+
+    @Override
+    public void finish() {
+
+        if (mDirty != false) {
+            Intent intent = new Intent();
+            intent.putExtra(CADEDATE,mCadedate.toString());
+            intent.putExtra(GROUP_POSITION,mGroup);
+            intent.putExtra(CHILD_POSITION,mChild);
+
+            setResult(RESULT_OK,intent);
+        }
+
+
+        super.finish();
+    }
+
+    private void init() {
+        mCtx = this;
+        Intent intent = getIntent();
+        String cadedate_str = intent.getStringExtra(CADEDATE);
+        try {
+            mCadedate = new JSONObject(cadedate_str);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        mSingleSelect = intent.getBooleanExtra(SINGLE_SELECT,true);
+        mGroup = intent.getIntExtra(GROUP_POSITION,0);
+        mChild = intent.getIntExtra(CHILD_POSITION,0);
+        mTitle = intent.getStringExtra(TITLE);
+        maxSelect = intent.getIntExtra(MAX_SELECT,0);
+        mAuto_close = intent.getBooleanExtra(AUTO_CLOSE,true);
+
+
+    }
+
+    private class CellClickListener implements AdapterView.OnItemClickListener {
+
+        private Context ctx;
+        public CellClickListener(Context ctx) {
+            this.ctx = ctx;
+        }
+
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+
+//            if (isEditing) {
+//                return;
+//            }
+
+            mDirty = true;
+
+            try {
+                if (mSingleSelect) {
+
+                    boolean is_worked = false;
+
+                    if (mKeywords == null || mKeywords.isEmpty()) {
+
+                        for (int i = 0; i < mCadedate.optInt("count"); i++) {
+                            JSONObject val_json = mCadedate.optJSONObject("val_" + i);
+
+                            if (i == position) {
+                                int select = val_json.optInt("check");
+                                if (select == 0) {
+                                    val_json.put("check","1");
+                                } else {
+                                    val_json.put("check","0");
+                                }
+                                is_worked = select == 0;
+                                mCadedate.put("val_" + i,val_json);
+                                break;
+                            }
+
+
+
+                        } // for
+
+                    } // keywords null
+                    else {
+
+
+                        JSONObject val_json = null;
+                        int count = 0;
+                        for (int cc = 0; cc < mCadedate.optInt("count"); cc++) {
+                            if (count >= filter_count) {
+                                break;
+                            }
+                            JSONObject search_json = mCadedate.optJSONObject("val_" + cc);
+                            String value = search_json.optString("value");
+                            boolean contain = value.toUpperCase().contains(mKeywords.toUpperCase());
+                            if (contain) {
+                                count++;
+                            } else {
+                                continue;
+                            }
+
+                            if (count - 1 == position) {
+                                val_json = search_json;
+
+                                //==========
+                                int select = val_json.optInt("check");
+                                if (select != 0) {
+                                    val_json.put("check","0");
+                                } else {
+                                    val_json.put("check","1");
+                                }
+                                is_worked = select == 0;
+
+
+                                mCadedate.put("val_" + cc,val_json);
+
+                                break;
+                            }
+                        } // for cc
+
+//                        for (int sc = 0; sc < mCadedate.optInt("count"); sc++) {
+//
+//                            JSONObject sc_json = mCadedate.optJSONObject("val_" + sc);
+//
+//                            if (sc_json.optString("value").equals(val_json.optString("value"))) {
+//                                sc_json.put("check","1");
+//                            } else {
+//                                sc_json.put("check","0");
+//                            }
+//                            mCadedate.put("val_" + sc,sc_json);
+//
+//                        } // for sc
+
+
+                    }
+
+                    if (is_worked) {
+                        if (mAuto_close) {
+                            finish();
+                        } else {
+                            adapter.notifyDataSetChanged();
+                        }
+                    } else {
+                        adapter.notifyDataSetChanged();
+                    }
+
+
+                } // single select
+                else {
+
+                    int index = position;
+                    JSONObject val_json = null;
+                    if (mKeywords == null || mKeywords.isEmpty()) {
+                        val_json = mCadedate.optJSONObject("val_" + position);
+                    } else {
+                        int count = 0;
+                        for (int i = 0; i < mCadedate.optInt("count"); i++) {
+                            if (count >= filter_count) {
+                                break;
+                            }
+                            JSONObject search_json = mCadedate.optJSONObject("val_" + i);
+                            String value = search_json.optString("value");
+                            boolean contain = value.toUpperCase().contains(mKeywords.toUpperCase());
+                            if (contain) {
+                                count++;
+                            }
+
+                            if (count - 1 == position) {
+                                val_json = search_json;
+                                index = i;
+                                break;
+                            }
+                        }
+                    }
+
+                    int check = val_json.optInt("check");
+                    if (check == 1) {
+                        val_json.put("check","0");
+                    } else {
+                        if (check_count() >= maxSelect && maxSelect > 0) {
+                            new AlertDialog.Builder(this.ctx)
+                                    .setTitle("Max count reached")
+                                    .setMessage(maxSelect + " items at most for this field.")
+                                    .setPositiveButton("OK",null)
+                                    .show();
+                            return;
+
+                        }
+                        val_json.put("check","1");
+                    }
+                    mCadedate.put("val_" + index,val_json);
+
+                }
+                adapter.notifyDataSetChanged();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+    public int check_count() {
+
+        int check_count = 0;
+        for (int i = 0; i < mCadedate.optInt("count"); i++) {
+            JSONObject val_json = mCadedate.optJSONObject("val_" + i);
+            int check = val_json.optInt("check");
+            if (check == 1) {
+                check_count++;
+            }
+        }
+        return check_count;
+    }
+
+
+    private class EnumAdapter extends DragListView.DragListAdapter {
+
+        public class Holder {
+            public TextView value_tv;
+            public ImageView check_iv;
+            public ImageView drag_iv;
+
+            public Holder(View cell) {
+                if (cell == null) {
+                    return;
+                }
+                value_tv = (TextView)cell.findViewById(R.id.enum_value_tv);
+                check_iv = (ImageView)cell.findViewById(R.id.enum_check_iv);
+                check_iv.setClickable(false);
+                check_iv.setFocusable(false);
+                drag_iv = (ImageView)cell.findViewById(R.id.drag_list_item_image);
+
+                cell.setTag(this);
+
+            }
+        }
+
+
+        private Context ctx;
+        public EnumAdapter(Context context) {
+            this.ctx = context;
+        }
+
+        @Override
+        public int getCount() {
+
+            if (mCadedate == null) {
+                return 0;
+            }
+
+            if (mKeywords == null || mKeywords.isEmpty()) {
+                filter_count = 0;
+                return mCadedate.optInt("count");
+            }
+
+            int count = 0;
+            for (int i = 0; i < mCadedate.optInt("count"); i++) {
+                JSONObject val_json = mCadedate.optJSONObject("val_" + i);
+                String value = val_json.optString("value");
+                boolean contain = value.toUpperCase().contains(mKeywords.toUpperCase());
+                if (contain) {
+                    count++;
+                }
+            }
+            filter_count = count;
+            return count;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            JSONObject val_json = null;
+            if (mKeywords == null || mKeywords.isEmpty()) {
+                val_json = mCadedate.optJSONObject("val_" + position);
+            } else {
+                int count = 0;
+                for (int i = 0; i < mCadedate.optInt("count"); i++) {
+                    if (count >= filter_count) {
+                        break;
+                    }
+                    JSONObject search_json = mCadedate.optJSONObject("val_" + i);
+                    String value = search_json.optString("value");
+                    boolean contain = value.toUpperCase().contains(mKeywords.toUpperCase());
+                    if (contain) {
+                        count++;
+                    } else {
+                        continue;
+                    }
+
+                    if (count - 1 == position) {
+                        val_json = search_json;
+                        break;
+                    }
+
+                }
+            }
+            return val_json;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            JSONObject val_json = (JSONObject) getItem(position);
+//            if (mKeywords == null || mKeywords.isEmpty()) {
+//                val_json = mCadedate.optJSONObject("val_" + position);
+//            } else {
+//                val_json = (JSONObject) getItem(position);
+//            }
+
+            EnumAdapter.Holder holder;
+            if (convertView == null) {
+
+                convertView = LayoutInflater.from(this.ctx).inflate(R.layout.enum_select_sort_cell,null);
+                holder = new EnumAdapter.Holder(convertView);
+
+            } else {
+                holder = (EnumAdapter.Holder) convertView.getTag();
+            }
+
+            String value = val_json.optString("value");
+            holder.value_tv.setText(value);
+
+            int check = val_json.optInt("check");
+            if (check == 1) {
+                holder.check_iv.setVisibility(View.VISIBLE);
+            } else {
+                holder.check_iv.setVisibility(View.INVISIBLE);
+            }
+
+
+//            if (isEditing) {
+//                holder.check_iv.setVisibility(View.INVISIBLE);
+//                holder.drag_iv.setVisibility(View.VISIBLE);
+//                holder.drag_iv.setFocusable(false);
+//                holder.drag_iv.setClickable(false);
+//            } else {
+//                if (check == 1) {
+//                    holder.check_iv.setVisibility(View.VISIBLE);
+//                } else {
+//                    holder.check_iv.setVisibility(View.INVISIBLE);
+//                }
+//                holder.drag_iv.setFocusable(false);
+//                holder.drag_iv.setClickable(false);
+//                holder.drag_iv.setVisibility(View.INVISIBLE);
+//            }
+
+            return convertView;
+        }
+
+        @Override
+        public void insert(Object object,int position) {
+
+            int count = getCount();
+
+            mDirty = true;
+            if (position >= count) {
+                if (position > count) {
+                    position = count;
+                }
+
+                JSONObject val_json = (JSONObject)object;
+                try {
+                    mCadedate.put("val_" + position, val_json);
+                    mCadedate.put("count", count+1);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+
+
+            } else {
+                if (position < 0) {
+                    position = 0;
+                }
+
+                try {
+                    for (int i = count - 1; i >= position; i--) {
+                        JSONObject val_json = mCadedate.getJSONObject("val_" + i);
+                        mCadedate.put("val_" + (i + 1),val_json);
+                    }
+
+                    JSONObject val_json = (JSONObject)object;
+                    mCadedate.put("val_" + position, val_json);
+                    mCadedate.put("count", count+1);
+
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+
+            }
+        }
+
+        @Override
+        public void remove(Object object) {
+
+            int count = getCount();
+            if (count <= 0) {
+                return;
+            }
+
+            mDirty = true;
+            try {
+                int remove_index = count;
+                for (int i = 0; i < count; i++) {
+                    JSONObject val_json = mCadedate.getJSONObject("val_" + i);
+                    if (val_json.equals(object)) {
+                        remove_index = i;
+                    }
+                    if (remove_index < count) { // 有删除
+                        if (i > remove_index) {
+                            mCadedate.put("val_" + (i - 1),val_json);
+                        }
+
+                        if (i == count - 1) { // 清除末尾
+                            mCadedate.put("val_" + i,null);
+                        }
+                        mCadedate.put("count",count - 1);
+                    }
+                }
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+
+
+}

+ 32 - 17
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/EnumSlectActivity.java

@@ -237,13 +237,18 @@ public class EnumSlectActivity extends AppCompatActivity {
                             JSONObject val_json = mCadedate.optJSONObject("val_" + i);
 
                             if (i == position) {
-                                val_json.put("check","1");
-                            } else {
-                                val_json.put("check","0");
+                                int select = val_json.optInt("check");
+                                if (select == 0) {
+                                    val_json.put("check","1");
+                                } else {
+                                    val_json.put("check","0");
+                                }
+                                is_worked = select == 0;
+                                mCadedate.put("val_" + i,val_json);
+                                break;
                             }
-                            is_worked = i == position;
 
-                            mCadedate.put("val_" + i,val_json);
+
 
                         } // for
 
@@ -262,6 +267,8 @@ public class EnumSlectActivity extends AppCompatActivity {
                             boolean contain = value.toUpperCase().contains(mKeywords.toUpperCase());
                             if (contain) {
                                 count++;
+                            } else {
+                                continue;
                             }
 
                             if (count - 1 == position) {
@@ -274,9 +281,9 @@ public class EnumSlectActivity extends AppCompatActivity {
                                 } else {
                                     val_json.put("check","1");
                                 }
-
                                 is_worked = select == 0;
 
+
                                 mCadedate.put("val_" + cc,val_json);
 
                                 break;
@@ -431,17 +438,6 @@ public class EnumSlectActivity extends AppCompatActivity {
 
         @Override
         public Object getItem(int position) {
-            JSONObject val_json = mCadedate.optJSONObject("val_" + position);
-            return val_json;
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
             JSONObject val_json = null;
             if (mKeywords == null || mKeywords.isEmpty()) {
                 val_json = mCadedate.optJSONObject("val_" + position);
@@ -456,14 +452,33 @@ public class EnumSlectActivity extends AppCompatActivity {
                     boolean contain = value.toUpperCase().contains(mKeywords.toUpperCase());
                     if (contain) {
                         count++;
+                    } else {
+                        continue;
                     }
 
                     if (count - 1 == position) {
                         val_json = search_json;
+                        break;
                     }
 
                 }
             }
+            return val_json;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            JSONObject val_json = (JSONObject) getItem(position);
+//            if (mKeywords == null || mKeywords.isEmpty()) {
+//                val_json = mCadedate.optJSONObject("val_" + position);
+//            } else {
+//                val_json = (JSONObject) getItem(position);
+//            }
 
             Holder holder;
             if (convertView == null) {

BIN
RedAnt Mobile/app/src/main/res/drawable/ic_drag.png


+ 45 - 0
RedAnt Mobile/app/src/main/res/layout/activity_enum_select_and_sort.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    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:orientation="vertical"
+    tools:context="com.usai.redant.CommonEditor.EnumSelectAndSort.EnumSelectAndSortActivity">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        >
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="10dp"
+            android:layout_marginTop="5dp"
+            android:layout_marginBottom="5dp"
+            android:background="@drawable/circle_corner_border"
+            >
+            <EditText
+                android:id="@+id/common_editor_enum_select_sort_search_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginStart="5dp"
+                android:background="@null"
+                android:hint="filter"
+                android:imeOptions="actionGo"
+                android:maxLines="1"
+                />
+        </RelativeLayout>
+
+    </RelativeLayout>
+
+    <com.usai.redant.CommonEditor.EnumSelectAndSort.DragListView
+        android:id="@+id/enum__select_sort_list_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
+
+
+</LinearLayout>

+ 48 - 0
RedAnt Mobile/app/src/main/res/layout/enum_select_sort_cell.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="40dp">
+
+    <ImageView
+        android:id="@+id/drag_list_item_image"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:src="@drawable/ic_drag"
+        android:visibility="invisible"
+        />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        >
+
+        <TextView
+            android:id="@+id/enum_value_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_alignParentLeft="true"
+            android:layout_alignParentStart="true"
+            android:layout_marginLeft="5dp"
+            android:layout_marginStart="5dp"
+            android:textColor="#000000"
+            />
+
+        <ImageView
+            android:id="@+id/enum_check_iv"
+            android:layout_width="20dp"
+            android:layout_height="20dp"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="5dp"
+            android:layout_marginEnd="5dp"
+            android:scaleType="fitCenter"
+            android:src="@drawable/check"/>
+
+    </RelativeLayout>
+
+
+</RelativeLayout>

+ 13 - 0
RedAnt Mobile/app/src/main/res/menu/enum_select_sort_menu.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/enum_menu_sort"
+        android:title="Sort"
+        app:showAsAction="always"
+        >
+
+    </item>
+
+</menu>