فهرست منبع

提交1.0.9版本,修复同一个页面插入不同数据缓存问题

yanyi 4 سال پیش
والد
کامیت
71b8bdcb0b

+ 4 - 3
README.md

@@ -1,6 +1,6 @@
 # Picker
 
-![](https://img.shields.io/badge/picker-1.0.5-green)
+![](https://img.shields.io/badge/picker-1.0.9-green)
 
 ## Picker仿京东地址选择器
 ## 使用
@@ -15,7 +15,7 @@ repositories {
 ~~~
 ### module 下添加
 ~~~
-implementation 'com.yanyi.benyanyi:picker:1.0.8'
+implementation 'com.yanyi.benyanyi:picker:1.0.9'
 ~~~
 
 或者
@@ -23,7 +23,7 @@ implementation 'com.yanyi.benyanyi:picker:1.0.8'
 <dependency>
   <groupId>com.yanyi.benyanyi</groupId>
   <artifactId>picker</artifactId>
-  <version>1.0.8</version>
+  <version>1.0.9</version>
   <type>aar</type>
 </dependency>
 ~~~
@@ -130,6 +130,7 @@ class ChildrenX : PickerBean<ChildrenX>() {
 ~~~
 
 ### 更新记录
+* 2021-11-08 提交1.0.9版本,修复同一个页面插入不同数据缓存问题
 * 2021-08-27 提交1.0.8版本,修改maven地址
 * 2021-03-12 提交1.0.7版本,修复第一次不选择后取消再重新选择闪退问题
 * 2020-12-01 提交1.0.6版本,添加数据不要存储参数

+ 23 - 5
app/src/main/java/com/benyanyi/pickerutils/MainActivity.java

@@ -18,11 +18,15 @@ public class MainActivity extends AppCompatActivity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
-        oList.add(new TestBean("测试1"));
-        oList.add(new TestBean("测试2"));
-        oList.add(new TestBean("测试3"));
-        oList.add(new TestBean("测试4"));
-        oList.add(new TestBean("测试5"));
+        List<TestBean.Test2Bean> list = new ArrayList<>();
+        for (int i = 0; i < 5; i++) {
+            list.add(new TestBean.Test2Bean(i + ""));
+        }
+        oList.add(new TestBean("测试1", list));
+        oList.add(new TestBean("测试2", list));
+        oList.add(new TestBean("测试3", list));
+        oList.add(new TestBean("测试4", list));
+        oList.add(new TestBean("测试5", list));
         findViewById(R.id.but).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -37,5 +41,19 @@ public class MainActivity extends AppCompatActivity {
                         }).show();
             }
         });
+        findViewById(R.id.but2).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                PickerHelper.getInstance().init(MainActivity.this)
+                        .setTitle("测试选择2")
+                        .setData(oList)
+                        .setPickerCallback(new PickerHelper.PickerCallback() {
+                            @Override
+                            public void callback(List<String> msgList, List<Integer> indexList) {
+                                Log.v("测试2鸭", msgList.toString());
+                            }
+                        }).show();
+            }
+        });
     }
 }

+ 12 - 2
app/src/main/java/com/benyanyi/pickerutils/TestBean.java

@@ -2,15 +2,25 @@ package com.benyanyi.pickerutils;
 
 import com.benyanyi.picker.bean.PickerBean;
 
+import java.util.List;
+
 /**
  * @author YanYi
  * @date 2021/3/12 9:57
  * @email ben@yanyi.red
  * @overview
  */
-public class TestBean extends PickerBean<TestBean> {
+public class TestBean extends PickerBean<TestBean.Test2Bean> {
 
-    public TestBean(String name) {
+    public TestBean(String name, List<Test2Bean> list) {
         this.setName(name);
+        this.setList(list);
+    }
+
+    public static class Test2Bean extends PickerBean<Test2Bean>{
+        public Test2Bean(String name) {
+            this.setName(name);
+        }
     }
+
 }

+ 15 - 4
app/src/main/res/layout/activity_main.xml

@@ -1,19 +1,30 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:orientation="horizontal"
     tools:context=".MainActivity">
 
-    <TextView
+    <Button
         android:id="@+id/but"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="Hello World!"
+        android:text="测试1"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    <Button
+        android:id="@+id/but2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="测试2"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</LinearLayout>

+ 118 - 86
picker/src/main/java/com/benyanyi/picker/PickerDialog.java

@@ -3,6 +3,7 @@ package com.benyanyi.picker;
 import android.app.Dialog;
 import android.content.Context;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.view.View;
 import android.view.ViewGroup;
@@ -29,6 +30,9 @@ import java.util.Map;
  * @overview
  */
 class PickerDialog extends Dialog {
+
+    private boolean isCache;
+
     private RecyclerView titleRecycler;
     //    private View titleView;
     private RecyclerView msgRecycler;
@@ -40,25 +44,21 @@ class PickerDialog extends Dialog {
     /**
      * 数据源
      */
-    private List<PickerBean<?>> oList = new ArrayList<>();
-
     private Map<String, List<PickerBean<?>>> oMap = new HashMap<>();
 
     /**
      * 标题数据
      */
-    private List<String> titleList = new ArrayList<>();
+    private Map<String, List<String>> titleMap = new HashMap<>();
 
     /**
      * 每次选择位于数据源对应的下标
      */
-    private List<Integer> indexList = new ArrayList<>();
-
+    private Map<String, List<Integer>> indexMap = new HashMap<>();
     /**
      * 内容数据
      */
-    private List<PickerBean<?>> msgList = new ArrayList<>();
-
+    private Map<String, List<PickerBean<?>>> msgMap = new HashMap<>();
     /**
      * map对应的key
      */
@@ -71,19 +71,20 @@ class PickerDialog extends Dialog {
 
     private int index = -1;
 
-    public PickerDialog(@NonNull Context context) {
+    public PickerDialog(@NonNull Context context, boolean isCache) {
         super(context);
+        this.isCache = isCache;
     }
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.weight_picker_view);
-        titleRecycler = findViewById(R.id.picker_title_recycler);
+        this.titleRecycler = findViewById(R.id.picker_title_recycler);
 //        titleView = findViewById(R.id.picker_title_view);
-        msgRecycler = findViewById(R.id.picker_msg_recycler);
-        titleTv = findViewById(R.id.picker_title);
-        titleTv.setText(title);
+        this.msgRecycler = findViewById(R.id.picker_msg_recycler);
+        this.titleTv = findViewById(R.id.picker_title);
+        this.titleTv.setText(this.title);
         findViewById(R.id.picker_cancel).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -100,42 +101,41 @@ class PickerDialog extends Dialog {
     private void initTitle() {
         LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
         layoutManager.setOrientation(RecyclerView.HORIZONTAL);
-        titleRecycler.setLayoutManager(layoutManager);
-        titleAdapter = new PickerTitleAdapter(getContext(), titleList);
-        titleRecycler.setAdapter(titleAdapter);
-        titleAdapter.setOnItemListener(new BaseDialogRecyclerAdapter.OnItemListener() {
+        this.titleRecycler.setLayoutManager(layoutManager);
+        this.titleAdapter = new PickerTitleAdapter(getContext(), this.titleMap.get(this.title));
+        this.titleRecycler.setAdapter(this.titleAdapter);
+        this.titleAdapter.setOnItemListener(new BaseDialogRecyclerAdapter.OnItemListener() {
             @Override
             public void onItemListener(int position) {//标题栏点击事件
-                index = position;
-                if (DataUtil.isListNotEmpty(oList)) {
-                    List<String> list = new ArrayList<>(titleList);
-                    List<Integer> iList = new ArrayList<>(indexList);
+                PickerDialog.this.index = position;
+                if (DataUtil.isListNotEmpty(PickerDialog.this.oMap.get(PickerDialog.this.title))) {
+                    List<String> list = new ArrayList<>(PickerDialog.this.titleMap.get(PickerDialog.this.title));
+                    List<Integer> iList = new ArrayList<>(PickerDialog.this.indexMap.get(PickerDialog.this.title));
                     if (DataUtil.isListNotEmpty(list) && position < list.size() - 1) {
-                        titleList.clear();
-                        indexList.clear();
-                        msgList.clear();
-                        for (int i = 0; i <= position; i++) {
-                            titleList.add(list.get(i));
-                            indexList.add(iList.get(i));
+                        PickerDialog.this.titleMap.get(PickerDialog.this.title).clear();
+                        PickerDialog.this.indexMap.get(PickerDialog.this.title).clear();
+                        PickerDialog.this.msgMap.get(PickerDialog.this.title).clear();
+                        for (int i = 0; i <= PickerDialog.this.index; i++) {
+                            PickerDialog.this.titleMap.get(PickerDialog.this.title).add(list.get(i));
+                            PickerDialog.this.indexMap.get(PickerDialog.this.title).add(iList.get(i));
                         }
-                        if (DataUtil.isListNotEmpty(indexList)) {
-                            msgAdapter.setSelectPosition(indexList.get(position));
+                        if (DataUtil.isListNotEmpty(PickerDialog.this.indexMap.get(PickerDialog.this.title))) {
+                            PickerDialog.this.msgAdapter.setSelectPosition(PickerDialog.this.indexMap.get(PickerDialog.this.title).get(PickerDialog.this.index));
                         } else {
-                            titleList.add("请选择");
-                            msgAdapter.setSelectPosition(-1);
+                            PickerDialog.this.titleMap.get(PickerDialog.this.title).add("请选择");
+                            PickerDialog.this.msgAdapter.setSelectPosition(-1);
                         }
                         if (position == 0) {
-                            msgList.addAll(oList);
+                            PickerDialog.this.msgMap.get(PickerDialog.this.title).addAll(PickerDialog.this.oMap.get(PickerDialog.this.title));
                         } else {
-                            PickerBean pickerBean = null;
-                            for (int i = 1; i <= position; i++) {
-                                pickerBean = oList.get(indexList.get(position - 1));
-                            }
-                            msgList.addAll(pickerBean.getList());
+                            PickerBean pickerBean = PickerDialog.this.oMap.get(PickerDialog.this.title).get(PickerDialog.this.indexMap.get(PickerDialog.this.title).get(PickerDialog.this.indexMap.get(PickerDialog.this.title).size() - 1));
+                            PickerDialog.this.msgMap.get(PickerDialog.this.title).addAll(pickerBean.getList());
                         }
-                        titleAdapter.notifyDataSetChanged(titleList);
+                        PickerDialog.this.titleAdapter.notifyDataSetChanged(PickerDialog.this.titleMap.get(PickerDialog.this.title));
 //                    tabSelectedIndicatorAnimation(titleAdapter.getTextView()).start();
-                        msgAdapter.notifyDataSetChanged(msgList);
+                        PickerDialog.this.msgAdapter.notifyDataSetChanged(PickerDialog.this.msgMap.get(PickerDialog.this.title));
+                        PickerDialog.this.titleRecycler.scrollToPosition(PickerDialog.this.titleMap.get(PickerDialog.this.title).size() - 1);
+                        PickerDialog.this.msgRecycler.scrollToPosition(PickerDialog.this.indexMap.get(PickerDialog.this.title).get(PickerDialog.this.index));
                     }
                 }
             }
@@ -143,42 +143,43 @@ class PickerDialog extends Dialog {
     }
 
     private void initMsg() {
-        msgRecycler.setLayoutManager(new LinearLayoutManager(getContext()));
-        msgAdapter = new PickerMsgAdapter(getContext(), msgList);
-        msgRecycler.setAdapter(msgAdapter);
-        msgAdapter.setOnItemListener(new BaseDialogRecyclerAdapter.OnItemListener() {
+        PickerDialog.this.msgRecycler.setLayoutManager(new LinearLayoutManager(getContext()));
+        PickerDialog.this.msgAdapter = new PickerMsgAdapter(getContext(), PickerDialog.this.msgMap.get(PickerDialog.this.title));
+        PickerDialog.this.msgRecycler.setAdapter(PickerDialog.this.msgAdapter);
+        PickerDialog.this.msgAdapter.setOnItemListener(new BaseDialogRecyclerAdapter.OnItemListener() {
             @Override
             public void onItemListener(int position) {
-                if (msgList.size() > 0) {
-                    PickerBean bean = msgList.get(position);
-                    if (index > -1) {
-                        indexList.set(index, position);
-                        index = -1;
+                if (PickerDialog.this.msgMap.get(PickerDialog.this.title).size() > 0) {
+                    PickerBean bean = PickerDialog.this.msgMap.get(PickerDialog.this.title).get(position);
+                    if (PickerDialog.this.index > -1) {
+                        PickerDialog.this.indexMap.get(PickerDialog.this.title).set(PickerDialog.this.indexMap.get(PickerDialog.this.title).size() - 1, position);
+                        PickerDialog.this.index = -1;
                     } else {
-                        indexList.add(position);
+                        PickerDialog.this.indexMap.get(PickerDialog.this.title).add(position);
                     }
 
-                    titleList.set(titleList.size() - 1, bean.getName());
-                    titleAdapter.notifyDataSetChanged(titleList);
-                    msgAdapter.setSelectPosition(position);
-                    msgAdapter.notifyItemChanged(position);
+                    PickerDialog.this.titleMap.get(PickerDialog.this.title).set(PickerDialog.this.titleMap.get(PickerDialog.this.title).size() - 1, bean.getName());
+                    PickerDialog.this.titleAdapter.notifyDataSetChanged(PickerDialog.this.titleMap.get(PickerDialog.this.title));
+                    PickerDialog.this.msgAdapter.setSelectPosition(position);
+                    PickerDialog.this.msgAdapter.notifyItemChanged(position);
                     if (DataUtil.isListNotEmpty(bean.getList())) {
-                        titleList.add("请选择");
-                        msgList.clear();
-                        msgList.addAll(bean.getList());
-                        msgAdapter.setSelectPosition(-1);
-                        msgAdapter.notifyDataSetChanged(msgList);
+                        PickerDialog.this.titleMap.get(PickerDialog.this.title).add("请选择");
+                        PickerDialog.this.msgMap.get(PickerDialog.this.title).clear();
+                        PickerDialog.this.msgMap.get(PickerDialog.this.title).addAll(bean.getList());
+                        PickerDialog.this.msgAdapter.setSelectPosition(-1);
+                        PickerDialog.this.msgAdapter.notifyDataSetChanged(PickerDialog.this.msgMap.get(PickerDialog.this.title));
+                        PickerDialog.this.msgRecycler.scrollToPosition(0);
 //                tabSelectedIndicatorAnimation(titleAdapter.getTextView()).start();
                     } else {
                         dismiss();
-                        if (pickerCallback != null) {
-                            pickerCallback.callback(titleList, indexList);
+                        if (PickerDialog.this.pickerCallback != null) {
+                            PickerDialog.this.pickerCallback.callback(PickerDialog.this.titleMap.get(PickerDialog.this.title), PickerDialog.this.indexMap.get(PickerDialog.this.title));
                         }
                     }
                 } else {
                     dismiss();
-                    if (pickerCallback != null) {
-                        pickerCallback.callback(new ArrayList<String>(), new ArrayList<Integer>());
+                    if (PickerDialog.this.pickerCallback != null) {
+                        PickerDialog.this.pickerCallback.callback(new ArrayList<String>(), new ArrayList<Integer>());
                     }
                 }
             }
@@ -204,40 +205,71 @@ class PickerDialog extends Dialog {
         window.setBackgroundDrawableResource(android.R.color.transparent);
     }
 
-    public void setTitle(String title) {
-        this.title = title;
-        if (titleTv != null) {
-            titleTv.setText(title);
-        }
-    }
-
-    public <T extends PickerBean<?>> void setData(List<T> list) {
-        this.oList = (List<PickerBean<?>>) list;
-    }
-
     public void setPickerCallback(PickerHelper.PickerCallback pickerCallback) {
         this.pickerCallback = pickerCallback;
     }
 
-    @Override
-    public void show() {
+    public <T extends PickerBean<?>> void show(String title, List<T> list) {
         super.show();
-        if (DataUtil.isListEmpty(indexList)) {
-            titleList.clear();
-            indexList.clear();
-            msgList.clear();
-            index = -1;
-            titleList.add("请选择");
-            msgList.addAll(oList);
+        this.key = title;
+        List<T> l = list;
+        if (!isNotEmpty(this.key)) {
+            this.key = "dialog";
+        }
+        if (list.isEmpty()) {
+            l = new ArrayList<>();
+        }
+        if (isCache && !this.key.equals("dialog") && !this.oMap.isEmpty() && DataUtil.isListNotEmpty(oMap.get(this.key))) {
+            if (DataUtil.isListEmpty(indexMap.get(this.key))) {
+                this.titleMap.put(this.key, new ArrayList<String>());
+                this.indexMap.put(this.key, new ArrayList<Integer>());
+                this.msgMap.put(this.key, new ArrayList<PickerBean<?>>());
+                this.index = -1;
+                this.titleMap.get(this.key).add("请选择");
+                this.msgMap.get(this.key).addAll(oMap.get(this.key));
+            } else {
+                index = indexMap.get(this.key).get(indexMap.get(this.key).size() - 1);
+            }
+            this.title = this.key;
         } else {
-            if (DataUtil.isListNotEmpty(titleList)) {
-                index = titleList.size() - 1;
+            this.oMap.put(this.key, (List<PickerBean<?>>) l);
+            this.titleMap.put(this.key, new ArrayList<String>());
+            this.indexMap.put(this.key, new ArrayList<Integer>());
+            this.msgMap.put(this.key, new ArrayList<PickerBean<?>>());
+            this.index = -1;
+            this.titleMap.get(this.key).add("请选择");
+            this.msgMap.get(this.key).addAll(oMap.get(this.key));
+            if (this.key.equals("dialog")) {
+                this.title = "";
+            } else {
+                this.title = this.key;
+            }
+
+        }
+        if (this.titleTv != null) {
+            if (TextUtils.isEmpty(this.title)) {
+                this.titleTv.setText("");
             } else {
-                index = -1;
+                this.titleTv.setText(this.title);
             }
         }
-        titleAdapter.notifyDataSetChanged(titleList);
-        msgAdapter.notifyDataSetChanged(msgList);
+        this.msgAdapter.setSelectPosition(this.index);
+        this.titleAdapter.notifyDataSetChanged(this.titleMap.get(this.title));
+        this.msgAdapter.notifyDataSetChanged(this.msgMap.get(this.title));
+        if (DataUtil.isListNotEmpty(this.titleMap.get(this.title))) {
+            this.titleRecycler.scrollToPosition(this.titleMap.get(this.title).size() - 1);
+        } else {
+            this.titleRecycler.scrollToPosition(0);
+        }
+        if (DataUtil.isListNotEmpty(this.indexMap.get(this.title))) {
+            this.msgRecycler.scrollToPosition(this.index);
+        } else {
+            this.msgRecycler.scrollToPosition(0);
+        }
+    }
+
+    private boolean isNotEmpty(String str) {
+        return str != null && !TextUtils.isEmpty(str) && !"null".equals(str) && !str.trim().isEmpty();
     }
 
 //    /**

+ 14 - 18
picker/src/main/java/com/benyanyi/picker/PickerHelper.java

@@ -17,6 +17,9 @@ public class PickerHelper {
     private static PickerHelper instance;
     private PickerDialog pickerDialog;
     private Activity activity;
+    private String title;
+    private List<? extends PickerBean> oList;
+    private PickerCallback pickerCallback;
 
     public static PickerHelper getInstance() {
         if (instance == null) {
@@ -39,27 +42,25 @@ public class PickerHelper {
         }
         if (this.activity != activity) {
             this.activity = activity;
-            this.pickerDialog = new PickerDialog(this.activity);
+            this.pickerDialog = new PickerDialog(this.activity, isCache);
         } else if (this.pickerDialog == null) {
-            this.pickerDialog = new PickerDialog(this.activity);
-        }
-        if (!isCache) {
-            this.pickerDialog = new PickerDialog(this.activity);
+            this.pickerDialog = new PickerDialog(this.activity, isCache);
         }
         return this;
     }
 
     public PickerHelper setTitle(String title) {
-        if (this.pickerDialog != null) {
-            this.pickerDialog.setTitle(title);
-        }
+        this.title = title;
         return this;
     }
 
     public <T extends PickerBean<?>> PickerHelper setData(List<T> list) {
-        if (this.pickerDialog != null) {
-            this.pickerDialog.setData(list);
-        }
+        this.oList = list;
+        return this;
+    }
+
+    public PickerHelper setPickerCallback(PickerCallback pickerCallback) {
+        this.pickerCallback = pickerCallback;
         return this;
     }
 
@@ -68,7 +69,8 @@ public class PickerHelper {
             if (!this.pickerDialog.isShowing()) {
                 this.pickerDialog.dismiss();
             }
-            this.pickerDialog.show();
+            this.pickerDialog.setPickerCallback(this.pickerCallback);
+            this.pickerDialog.show(this.title, this.oList);
         }
     }
 
@@ -79,12 +81,6 @@ public class PickerHelper {
         this.pickerDialog = null;
     }
 
-    public PickerHelper setPickerCallback(PickerCallback pickerCallback) {
-        if (this.pickerDialog != null) {
-            this.pickerDialog.setPickerCallback(pickerCallback);
-        }
-        return this;
-    }
 
     public interface PickerCallback {
         void callback(List<String> msgList, List<Integer> indexList);

+ 0 - 7
picker/src/main/java/com/benyanyi/picker/bean/PickerBean.java

@@ -31,11 +31,4 @@ public class PickerBean<T extends PickerBean> implements Serializable {
         this.list = list;
     }
 
-    @Override
-    public String toString() {
-        return "PickerBean{" +
-                "name='" + name + '\'' +
-                ", list=" + list +
-                '}';
-    }
 }