Przeglądaj źródła

1.修改CommonEditor Android AutoComplete实现动态加载。

Pen Li 8 lat temu
rodzic
commit
6db21d0ca6

+ 38 - 21
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorAutoCompleteAdapter.java

@@ -1,8 +1,10 @@
 package com.usai.redant.CommonEditor.CommonEditor;
 
 import android.content.Context;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
 import android.widget.BaseAdapter;
 import android.widget.Filter;
 import android.widget.Filterable;
@@ -15,21 +17,29 @@ import java.util.List;
  * Created by macmini1 on 2017/12/18.
  */
 
-public class CommonEditorAutoCompleteAdapter extends BaseAdapter implements Filterable {
+public class CommonEditorAutoCompleteAdapter extends ArrayAdapter implements Filterable {
 
     private Context context;
     private List<String> list = new ArrayList<>();
-    public List<String> dataSource;
-    private int resourceId,textViewId;
+    private int resourceId, textViewId;
 
-    public CommonEditorAutoCompleteAdapter(Context context, int resourceId, int textViewId, List<String> dataSource) {
+    public CommonEditorAutoCompleteAdapter(Context context, int resourceId, int textViewId) {
+        super(context,resourceId,textViewId);
         this.context = context;
-        this.dataSource = dataSource;
+        this.resourceId = resourceId;
+        this.textViewId = textViewId;
     }
 
-    public void setDataSource(List<String> dataSource) {
-        this.dataSource = dataSource;
-        notifyDataSetChanged();
+    private String[] arr;
+    public void addObjects(String[] arr) {
+        this.arr = arr;
+        addAll((Object[]) arr);
+    }
+
+    @Override
+    public void clear() {
+        arr = null;
+        super.clear();
     }
 
     @Override
@@ -43,20 +53,25 @@ public class CommonEditorAutoCompleteAdapter extends BaseAdapter implements Filt
             @Override
             protected FilterResults performFiltering(CharSequence constraint) {
                 FilterResults results = new FilterResults();
-                if (constraint == null || constraint.length() == 0 || dataSource == null || dataSource.size() == 0) {
+
+                Log.d("Auto Complete Adapter", "performFiltering: " + constraint.toString());
+                int count = getCount();
+                if (constraint == null || constraint.length() == 0 || count == 0) {
                     //
                     results.values = null;
                     results.count = 0;
                 } else {
                     //这个newList是实际搜索出的结果集合,实际上是将该newList的数据赋给了list
                     List<String> newList = new ArrayList<>();
-                    for (String s : dataSource) {
+
+                    for (int i = 0; i < count; i++) {
+                        String s = (String) getItem(i);
                         //包含就添加到newList中
-                        if (s.contains(constraint.toString().trim()
-                        )) {
+                        if (s.contains(constraint.toString().trim())) {
                             newList.add(s);
                         }
                     }
+
                     //将newList传给results
                     results.values = newList;
                     results.count = newList.size();
@@ -73,14 +88,14 @@ public class CommonEditorAutoCompleteAdapter extends BaseAdapter implements Filt
             @Override
             protected void publishResults(CharSequence constraint, FilterResults results) {
 
-                // 主动再调用一次,获取最新的
-                results = performFiltering(constraint);
+                Log.d("Auto Complete Adapter", "publishResults: " + results.count);
 
                 if (results != null && results.count > 0) {//有符合过滤规则的数据
                     list.clear();
                     list.addAll((List<String>) results.values);
                     notifyDataSetChanged();
                 } else {//没有符合过滤规则的数据
+                    clear();
                     notifyDataSetInvalidated();
                 }
             }
@@ -101,7 +116,12 @@ public class CommonEditorAutoCompleteAdapter extends BaseAdapter implements Filt
 
     @Override
     public int getCount() {
-        return list != null && list.size() > 0 ? list.size() : 0;
+
+        if (arr != null) {
+            return arr.length;
+        } else {
+            return 0;
+        }
     }
 
     /**
@@ -112,14 +132,12 @@ public class CommonEditorAutoCompleteAdapter extends BaseAdapter implements Filt
      */
     @Override
     public Object getItem(int position) {
-        return list.get(position);
+        return arr[position];
     }
-
     @Override
     public long getItemId(int position) {
         return position;
     }
-
     @Override
     public View getView(final int position, View convertView, ViewGroup parent) {
         TvViewHolder holder;
@@ -134,12 +152,11 @@ public class CommonEditorAutoCompleteAdapter extends BaseAdapter implements Filt
         //注意这里不要为convertView添加点击事件,默认是点击后:①下拉窗收起;
         //②点击的条目数据会显示在搜索框中;③光标定位到字符串末位。
         //如果自己添加点击事件,就要首先实现上面的①、②、③。
-        holder.tv.setText(list.get(position));
+
+        holder.tv.setText((String) getItem(position));
         return convertView;
     }
-
     class TvViewHolder {
         TextView tv;
     }
-
 }

+ 1 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditor/CommonEditorEditAutoCompleteCellHolder.java

@@ -18,6 +18,7 @@ public class CommonEditorEditAutoCompleteCellHolder extends CommonEditorEditCell
 //    public TextView name_lb;
     public AutoCompleteTextView text_field;
     public CommonEditorAutoCompleteAdapter autoCompleteAdapter;
+    public String thread_identifier;
 
 
     public CommonEditorEditAutoCompleteCellHolder(Context context, View view) {

+ 71 - 17
RedAnt Mobile/app/src/main/java/com/usai/redant/CommonEditor/CommonEditorActivity.java

@@ -64,6 +64,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -2641,14 +2642,13 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
 
         holder.text_field.setThreshold(1);
         if (holder.autoCompleteAdapter == null) {
-           List<String> dataSource = new ArrayList<String>();
            int resourceId = R.layout.common_editor_auto_complete_list_cell;
            int textViewId = R.id.auto_complete_value_tv;
-           CommonEditorAutoCompleteAdapter autoCompleteAdapter = new CommonEditorAutoCompleteAdapter(mCtx,resourceId, textViewId, dataSource);
+           CommonEditorAutoCompleteAdapter autoCompleteAdapter = new CommonEditorAutoCompleteAdapter(mCtx,resourceId, textViewId);
            holder.text_field.setAdapter(autoCompleteAdapter);
            holder.autoCompleteAdapter = autoCompleteAdapter;
         } else {
-            ((CommonEditorAutoCompleteAdapter)holder.text_field.getAdapter()).dataSource.clear();
+            ((CommonEditorAutoCompleteAdapter)holder.text_field.getAdapter()).clear();
         }
 
 
@@ -4307,6 +4307,26 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
 
     }
 
+    public JSONArray sync_loadCadidate(String keyword,JSONObject item_json) {
+
+        if (keyword == null || keyword.isEmpty()) {
+            return null;
+        }
+
+        Bundle params = new Bundle();
+        params.putString("query_id",selfParams.getString("query_id"));
+        params.putString("name",item_json.optString("name"));
+        params.putString("keyword",keyword);
+
+        JSONObject json = Network.queryAutoComplete(params);
+
+        if (json != null) {
+            return json.optJSONArray("cadedate");
+        } else {
+            return null;
+        }
+    }
+
     /**Text Field Change*/
     public class TextFieldTextWatcher implements TextWatcher {
 
@@ -4360,7 +4380,7 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
         }
 
         @Override
-        public void afterTextChanged(Editable s) {
+        public void afterTextChanged(final Editable s) {
 
             /**
              * 文本处理
@@ -4380,7 +4400,7 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
             /**
              * 业务逻辑
              * */
-            JSONObject item_json = content_data_control.optJSONArray(group).optJSONObject(child);
+            final JSONObject item_json = content_data_control.optJSONArray(group).optJSONObject(child);
             if (item_json == null) {
                 return;
             }
@@ -4397,26 +4417,60 @@ public class CommonEditorActivity extends AppCompatActivity implements View.OnLa
             if (textView instanceof AutoCompleteTextView) {
 
                 final CommonEditorEditAutoCompleteCellHolder holder = (CommonEditorEditAutoCompleteCellHolder) ((View)textView.getParent().getParent()).getTag();
-                holder.autoCompleteAdapter.dataSource.clear();
+
+                holder.autoCompleteAdapter.clear();
+
+                final String threadIdentifier = UUID.randomUUID().toString();
+                holder.thread_identifier = threadIdentifier;
+
                 new Thread(new Runnable() {
                     @Override
                     public void run() {
 
+                        // 延迟0.8s 请求
                         try {
-                            Thread.sleep(2 * 1000);
-                        } catch (Exception e) {
 
+                            Thread.sleep(800);
+
+                        } catch (Exception e) {
+                            e.printStackTrace();
                         }
-                        runOnUiThread(new Runnable() {
-                            @Override
-                            public void run() {
-                                String [] arr={"aa","aab","aac","abcd","afok"};
-                               for (int i = 0; i < 5; i++) {
-                                   holder.autoCompleteAdapter.dataSource.add(arr[i]);
-                               }
-                               holder.autoCompleteAdapter.notifyDataSetChanged();
+                        if (threadIdentifier.equals(holder.thread_identifier)) {
+
+                            if (s == null || s.toString().length() < 1) {
+
+                            } else  {
+
+                                // 请求
+                                JSONArray cadedate = sync_loadCadidate(s.toString(),item_json);
+
+                                List<String> list = new ArrayList<>();
+                                for (int i = 0; i < cadedate.length(); i++) {
+                                    JSONObject object = cadedate.optJSONObject(i);
+                                    if (object != null) {
+                                        String str = object.optString("value");
+                                        if (str != null || !str.isEmpty()) {
+                                            list.add(str);
+                                        }
+                                    }
+
+                                }
+
+                                if (threadIdentifier.equals(holder.thread_identifier)) {
+                                    final String[] arr = (String[]) list.toArray(new String[list.size()]);
+
+                                    runOnUiThread(new Runnable() {
+                                        @Override
+                                        public void run() {
+
+                                            holder.autoCompleteAdapter.addObjects(arr);
+                                        }
+                                    });
+                                }
                             }
-                        });
+
+                        }
+
 
                     }
                 }).start();

+ 18 - 0
RedAnt Mobile/app/src/main/java/com/usai/redant/util/Network.java

@@ -1781,6 +1781,24 @@ public class Network
 
 	}
 
+	public static JSONObject queryAutoComplete(Bundle upparams) {
+		upparams.putString("_action","ant_mobile");
+		upparams.putString("_operate","query_autocomplete");
+
+		String json_string = getJson(RedAntApplication.server,upparams);
+
+		if (json_string == null || json_string.isEmpty()) {
+			return null;
+		}
+
+		try {
+			return new JSONObject(json_string);
+		} catch (JSONException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
 
 
 }

+ 4 - 2
RedAnt Mobile/app/src/main/res/layout/common_editor_auto_complete_list_cell.xml

@@ -1,12 +1,14 @@
 <?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="80dp">
+                android:layout_height="40dp"
+    android:minHeight="40dp">
+
 
     <TextView
         android:id="@+id/auto_complete_value_tv"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_height="40dp"
         android:layout_margin="5dp"
         android:gravity="start|center_vertical"
         android:textColor="#000000"