丁如意 發表於 2020-4-21 17:18:00

Android开发 PopupWindow开发的一些例子

<h1><span style="color: rgba(0, 128, 128, 1)">版权声明</span></h1>
<p>本文来自博客园,作者:观心静&nbsp;,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/12746009.html</p>
<div>本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。</div>
<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1>
<p>  这里有一些我实际使用PopupWindow开发的一些例子,分享大家开拓思路使用。此篇博客只有代码例子,无其他入门讲解,如果你需要学习,请参考我的另一篇博客:https://www.cnblogs.com/guanxinjing/p/10156153.html</p>
<p>&nbsp;</p>
<h1><span style="color: rgba(0, 128, 128, 1)">例子1</span></h1>
<p>类似长按文本弹出的处理文本的复制,黏贴,剪切,这种迷你对话框。代码较多,我放到github上了</p>
<p>github地址:https://github.com/z3880341/buttonDialog</p>
<h1><span style="color: rgba(0, 128, 128, 1)">例子2</span></h1>
<h2>效果图</h2>
<p>没有PopupWindow对话框时:</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202004/1497956-20200421170943871-370353431.png" alt=""></p>
<p>PopupWindow对话框出现时:</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202004/1497956-20200421171006586-2131111871.png" alt=""></p>
<h2><span style="color: rgba(0, 0, 0, 1)">dialog_family_list.xml</span></h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">xml version="1.0" encoding="utf-8"</span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">androidx.constraintlayout.widget.ConstraintLayout
    </span><span style="color: rgba(255, 0, 0, 1)">xmlns:android</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"</span><span style="color: rgba(255, 0, 0, 1)">
    xmlns:app</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res-auto"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
    android:background</span><span style="color: rgba(0, 0, 255, 1)">="@android:color/transparent"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ImageView
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/line1"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="1dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:background</span><span style="color: rgba(0, 0, 255, 1)">="@color/white"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingLeft</span><span style="color: rgba(0, 0, 255, 1)">="20dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:src</span><span style="color: rgba(0, 0, 255, 1)">="@drawable/line_black"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintLeft_toLeftOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintRight_toRightOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintTop_toTopOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">TextView
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/not_family"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
      android:drawableLeft</span><span style="color: rgba(0, 0, 255, 1)">="@drawable/ic_family_1"</span><span style="color: rgba(255, 0, 0, 1)">
      android:drawablePadding</span><span style="color: rgba(0, 0, 255, 1)">="13dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center_vertical|left"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingLeft</span><span style="color: rgba(0, 0, 255, 1)">="14dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingTop</span><span style="color: rgba(0, 0, 255, 1)">="14dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingBottom</span><span style="color: rgba(0, 0, 255, 1)">="14dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:text</span><span style="color: rgba(0, 0, 255, 1)">="@string/no_family_created_yet"</span><span style="color: rgba(255, 0, 0, 1)">
      android:textColor</span><span style="color: rgba(0, 0, 255, 1)">="@color/color_2C"</span><span style="color: rgba(255, 0, 0, 1)">
      android:textSize</span><span style="color: rgba(0, 0, 255, 1)">="16sp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:visibility</span><span style="color: rgba(0, 0, 255, 1)">="gone"</span><span style="color: rgba(255, 0, 0, 1)">
      android:background</span><span style="color: rgba(0, 0, 255, 1)">="@color/white"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintTop_toBottomOf</span><span style="color: rgba(0, 0, 255, 1)">="@id/line1"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintLeft_toLeftOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintRight_toRightOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">androidx.recyclerview.widget.RecyclerView
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/family_list_recyclerview"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:background</span><span style="color: rgba(0, 0, 255, 1)">="@color/ColorWhite"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintLeft_toLeftOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintRight_toRightOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintTop_toBottomOf</span><span style="color: rgba(0, 0, 255, 1)">="@id/not_family"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ImageView
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/line2"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="1dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:background</span><span style="color: rgba(0, 0, 255, 1)">="@color/white"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingLeft</span><span style="color: rgba(0, 0, 255, 1)">="20dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:src</span><span style="color: rgba(0, 0, 255, 1)">="@drawable/line_black"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintLeft_toLeftOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintRight_toRightOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintTop_toBottomOf</span><span style="color: rgba(0, 0, 255, 1)">="@id/family_list_recyclerview"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">View
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/translucent_bg"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:background</span><span style="color: rgba(0, 0, 255, 1)">="@color/color_80000000"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintTop_toBottomOf</span><span style="color: rgba(0, 0, 255, 1)">="@id/line2"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintBottom_toBottomOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintLeft_toLeftOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintRight_toRightOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">TextView
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/family_list"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
      android:drawableLeft</span><span style="color: rgba(0, 0, 255, 1)">="@drawable/ic_family_3"</span><span style="color: rgba(255, 0, 0, 1)">
      android:drawablePadding</span><span style="color: rgba(0, 0, 255, 1)">="13dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center_vertical|left"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingLeft</span><span style="color: rgba(0, 0, 255, 1)">="14dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingTop</span><span style="color: rgba(0, 0, 255, 1)">="14dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingBottom</span><span style="color: rgba(0, 0, 255, 1)">="14dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:text</span><span style="color: rgba(0, 0, 255, 1)">="@string/family_list"</span><span style="color: rgba(255, 0, 0, 1)">
      android:textColor</span><span style="color: rgba(0, 0, 255, 1)">="@color/color_2C"</span><span style="color: rgba(255, 0, 0, 1)">
      android:textSize</span><span style="color: rgba(0, 0, 255, 1)">="16sp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:background</span><span style="color: rgba(0, 0, 255, 1)">="@drawable/bg_family_list"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintLeft_toLeftOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintRight_toRightOf</span><span style="color: rgba(0, 0, 255, 1)">="parent"</span><span style="color: rgba(255, 0, 0, 1)">
      app:layout_constraintTop_toBottomOf</span><span style="color: rgba(0, 0, 255, 1)">="@id/line2"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
   

<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">androidx.constraintlayout.widget.ConstraintLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<h2>java</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> FamilyListDialog <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> PopupWindow {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> View mView;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> TextView mNotFamily;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> RecyclerView mFamilyListRecyclerview;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> TextView mFamilyList;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> View mTranslucentBg;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> FamilyListDialogAdapter mFamilyListDialogAdapter;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> FamilyListDialogListener mListener;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> mHeightPixels;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;FamilyBean&gt;<span style="color: rgba(0, 0, 0, 1)"> mFamilyBeanList;

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> FamilyListDialog(@NotNull Context context) {
      </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">();
      DisplayMetrics outMetrics </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DisplayMetrics();
      ((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(outMetrics);
      setWidth(outMetrics.widthPixels);
      mHeightPixels </span>=<span style="color: rgba(0, 0, 0, 1)"> outMetrics.heightPixels;
      setHeight(mHeightPixels);
      mView </span>= LayoutInflater.from(context).inflate(R.layout.dialog_family_list, <span style="color: rgba(0, 0, 255, 1)">null</span>, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      mNotFamily </span>=<span style="color: rgba(0, 0, 0, 1)"> (TextView) mView.findViewById(R.id.not_family);
      mFamilyListRecyclerview </span>=<span style="color: rgba(0, 0, 0, 1)"> (RecyclerView) mView.findViewById(R.id.family_list_recyclerview);
      mFamilyList </span>=<span style="color: rgba(0, 0, 0, 1)"> (TextView) mView.findViewById(R.id.family_list);
      mTranslucentBg </span>=<span style="color: rgba(0, 0, 0, 1)"> (View) mView.findViewById(R.id.translucent_bg);
      adaptiveRecyclerViewHeight(</span>5<span style="color: rgba(0, 0, 0, 1)">, context);
      mFamilyListDialogAdapter </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FamilyListDialogAdapter();
      mFamilyListRecyclerview.setAdapter(mFamilyListDialogAdapter);
      setContentView(mView);
      initListener();
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> showAsDropDown(View anchor) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(Build.VERSION.SDK_INT &gt;= 24<span style="color: rgba(0, 0, 0, 1)">) {
            Rect rect </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Rect();
            anchor.getGlobalVisibleRect(rect);
            DisplayMetrics outMetrics </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DisplayMetrics();
            Context context </span>=<span style="color: rgba(0, 0, 0, 1)"> anchor.getContext();
            ((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(outMetrics);
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> h = outMetrics.heightPixels -<span style="color: rgba(0, 0, 0, 1)"> rect.bottom;
            setHeight(h);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.showAsDropDown(anchor);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> initListener() {
      mTranslucentBg.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                dismiss();
            }
      });
      mNotFamily.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (mListener != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                  mListener.onClickNotFamily();
                }

            }
      });
      mFamilyList.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (mListener != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                  mListener.onClickFamilyList(mFamilyBeanList);
                }

            }
      });
      mFamilyListDialogAdapter.setOnItemClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FamilyListDialogAdapter.OnItemClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> OnItemClick(FamilyBean clickFamilyBean, <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> isConfirm) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (mListener != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                  mListener.onClickFamilyListItem(clickFamilyBean, isConfirm);
                }
            }
      });
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> setData(List&lt;FamilyBean&gt;<span style="color: rgba(0, 0, 0, 1)"> list) {
      mFamilyBeanList </span>=<span style="color: rgba(0, 0, 0, 1)"> list;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (list == <span style="color: rgba(0, 0, 255, 1)">null</span> ||<span style="color: rgba(0, 0, 0, 1)"> list.isEmpty()) {
            mFamilyListDialogAdapter.clearData();
            mFamilyListRecyclerview.setVisibility(View.GONE);
            mNotFamily.setVisibility(View.VISIBLE);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      mNotFamily.setVisibility(View.GONE);
      mFamilyListRecyclerview.setVisibility(View.VISIBLE);
      mFamilyListDialogAdapter.refreshData(list);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 自适应列表View在到指定数量item后固定高度,
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> targetNum
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> adaptiveRecyclerViewHeight(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> targetNum, Context context) {
      mFamilyListRecyclerview.setLayoutManager(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> LinearLayoutManager(context) {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, <span style="color: rgba(0, 0, 255, 1)">int</span> widthSpec, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> heightSpec) {
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> count =<span style="color: rgba(0, 0, 0, 1)"> state.getItemCount();
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (count &gt; 0<span style="color: rgba(0, 0, 0, 1)">) {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (count &gt;<span style="color: rgba(0, 0, 0, 1)"> targetNum) {
                        count </span>=<span style="color: rgba(0, 0, 0, 1)"> targetNum;
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">int</span> realHeight = 0<span style="color: rgba(0, 0, 0, 1)">;
                  </span><span style="color: rgba(0, 0, 255, 1)">int</span> realWidth = 0<span style="color: rgba(0, 0, 0, 1)">;
                  </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; count; i++<span style="color: rgba(0, 0, 0, 1)">) {
                        View view </span>= recycler.getViewForPosition(0<span style="color: rgba(0, 0, 0, 1)">);
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (view != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                            measureChild(view, widthSpec, heightSpec);
                            </span><span style="color: rgba(0, 0, 255, 1)">int</span> measuredWidth =<span style="color: rgba(0, 0, 0, 1)"> View.MeasureSpec.getSize(widthSpec);
                            </span><span style="color: rgba(0, 0, 255, 1)">int</span> measuredHeight =<span style="color: rgba(0, 0, 0, 1)"> view.getMeasuredHeight();
                            realWidth </span>= realWidth &gt; measuredWidth ?<span style="color: rgba(0, 0, 0, 1)"> realWidth : measuredWidth;
                            realHeight </span>= realHeight +<span style="color: rgba(0, 0, 0, 1)"> measuredHeight;
                        }
                  }
                  setMeasuredDimension(realWidth, realHeight);
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onMeasure(recycler, state, widthSpec, heightSpec);
                }
            }
      });
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 销毁,主要释放接口
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> destroy() {
      mListener </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 设置监听器
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> mListener
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setListener(FamilyListDialogListener mListener) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mListener =<span style="color: rgba(0, 0, 0, 1)"> mListener;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> FamilyListDialogListener {
      </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
         * 点击没有家庭
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClickNotFamily();

      </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
         * 点击家庭列表
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> onClickFamilyList(List&lt;FamilyBean&gt;<span style="color: rgba(0, 0, 0, 1)"> familyBeanList);

      </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
         * 点击列表item
         *
         * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> clickFamilyBean 被点击选择的家庭
         * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> isConfirm       是否已经加入此家庭
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> onClickFamilyListItem(FamilyBean clickFamilyBean, <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> isConfirm);

    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 对话框列表内部适配器类
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">class</span> FamilyListDialogAdapter <span style="color: rgba(0, 0, 255, 1)">extends</span> RecyclerView.Adapter&lt;FamilyListDialogAdapter.ViewHolder&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;FamilyBean&gt; mList = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> OnItemClickListener mOnItemClickListener;

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> refreshData(List&lt;FamilyBean&gt;<span style="color: rgba(0, 0, 0, 1)"> list) {
            mList.clear();
            mList.addAll(list);
            notifyDataSetChanged();

      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> clearData() {
            mList.clear();
            notifyDataSetChanged();
      }

      @NonNull
      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> viewType) {
            View view </span>= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_family_list_dialog, parent, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
            ViewHolder viewHolder </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ViewHolder(view);
            view.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
                @Override
                </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (mOnItemClickListener != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                        </span><span style="color: rgba(0, 0, 255, 1)">int</span> position =<span style="color: rgba(0, 0, 0, 1)"> viewHolder.getAdapterPosition();
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (position ==<span style="color: rgba(0, 0, 0, 1)"> RecyclerView.NO_POSITION) {
                            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
                        }
                        </span><span style="color: rgba(0, 0, 255, 1)">boolean</span> isConfirm = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
                        </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (FamilyBean.MembersBean membersBean : mList.get(position).getMembers()) {
                            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (membersBean.getUserId() == UserDataSP.getInstance().getUserId()) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在成员列表里查找到当前用户id</span>
                              isConfirm =<span style="color: rgba(0, 0, 0, 1)"> membersBean.isIsConfirm();
                              </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                            }
                        }
                        mOnItemClickListener.OnItemClick(mList.get(position), isConfirm);
                  }
                }
            });
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> viewHolder;
      }

      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onBindViewHolder(@NonNull ViewHolder holder, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> position) {
            FamilyBean familyItem </span>=<span style="color: rgba(0, 0, 0, 1)"> mList.get(position);
            holder.familyName.setText(familyItem.getName());
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (FamilyBean.MembersBean membersBean : familyItem.getMembers()) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (membersBean.getUserId() == UserDataSP.getInstance().getUserId()) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在成员列表里查找到当前用户id</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">membersBean.isIsConfirm()) {
                        holder.status.setText(R.string.waiting_to_join);
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                }
            }
            holder.status.setText(</span>""<span style="color: rgba(0, 0, 0, 1)">);
      }

      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getItemCount() {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mList.size();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setOnItemClickListener(OnItemClickListener listener) {
            mOnItemClickListener </span>=<span style="color: rgba(0, 0, 0, 1)"> listener;

      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">class</span> ViewHolder <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> RecyclerView.ViewHolder {
            View rootView;
            TextView familyName;
            TextView status;

            </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> ViewHolder(@NonNull View itemView) {
                </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">(itemView);
                rootView </span>=<span style="color: rgba(0, 0, 0, 1)"> itemView;
                familyName </span>=<span style="color: rgba(0, 0, 0, 1)"> (TextView) rootView.findViewById(R.id.family_name);
                status </span>=<span style="color: rgba(0, 0, 0, 1)"> (TextView) rootView.findViewById(R.id.status);
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> OnItemClickListener {
            </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
             * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> clickFamilyBean 被点击选择的家庭
             * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> isConfirm       是否已经加入此家庭
             </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
            <span style="color: rgba(0, 0, 255, 1)">void</span> OnItemClick(FamilyBean clickFamilyBean, <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> isConfirm);
      }

    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>End</p>

</div>
<div id="MySignature" role="contentinfo">
    <div style="text-align: center">
    <p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/12746009.html </p>
    <div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/12746009.html
頁: [1]
查看完整版本: Android开发 PopupWindow开发的一些例子