Spinner实现选择和删除已登录过的账号
效果图:
部分布局代码:
<FrameLayout android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" > <practice.jnzhang.com.practice.view.MySpinner android:id="@+id/sp_account" android:layout_width="match_parent" android:layout_height="1dp" android:spinnerMode="dropdown" android:background="@null" android:layout_gravity="bottom" android:layout_marginRight="@dimen/margin_30" android:overlapAnchor="false" /> <EditText android:id="@+id/et_login_name" android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/white" android:layout_marginRight="@dimen/margin_30" android:maxLength="18" android:inputType="number" android:paddingLeft="10dp" android:hint="@string/phone_and_iccard" android:textColor="@color/black" /> <ImageView android:id="@+id/iv_show_spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_keyboard_arrow_down_black_24dp" android:layout_gravity="end|center_vertical" /> </FrameLayout>
输入框把spinner遮挡住,spinner高度设置成1dp,设置弹窗从下面弹出。
如果直接使用spinner,item点击后不会自动消失(效果图在文末尾)。这里需要自定义spinner,并主动调用隐藏onDEtachedFromWindow()方法来隐藏弹窗。spinner隐藏弹窗的方法protected修饰的。不可以直接调用。
部分spninner源码:
@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mPopup != null && mPopup.isShowing()) { mPopup.dismiss(); } }
自定义spinner代码:
public class MySpinner extends AppCompatSpinner { public MySpinner(Context context) { super(context); } public MySpinner(Context context, AttributeSet attrs) { super(context, attrs); } public MySpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); } }
弹窗监听部分代码:
private void initSpinnerAdapter() { spLoginAccountAdapter = new SpLoginAccountAdapter(getActivity(), new ArrayList<String>()); spLoginAccountAdapter.setDeleteLetener(new SpLoginAccountAdapter.DeleteCardListener() { @Override public void deleteCallbck(int position, View v) { presenter.deletePhoneNumber(acounts.get(position)); acounts = presenter.selectPhoneNumber(); spLoginAccountAdapter.setAdapterDate(acounts); if (acounts.size() == 0) { sp_account.onDetachedFromWindow(); } } }); spLoginAccountAdapter.setItemClickLitenner(new SpLoginAccountAdapter.ItemClickLitenner() { @Override public void onClickCallBack(int position, View view) { logiName = acounts.get(position); et_login_name.setText(FormatUtil.formatePhoneNumberHide(logiName)); sp_account.onDetachedFromWindow(); } }); sp_account.setAdapter(spLoginAccountAdapter); }
adapter全部代码:
public class SpLoginAccountAdapter extends BaseAdapter { private List<String> adapterDate; private Context context; private DeleteCardListener deleteCardListener; private SpLoginAccountAdapter.ItemClickLitenner itemClickLitenner; public SpLoginAccountAdapter(Context context, List<String> adapterDate) { this.context = context; this.adapterDate = adapterDate; } public void setAdapterDate(List<String> adapterDate) { this.adapterDate = adapterDate; notifyDataSetChanged(); } public void setDeleteLetener(DeleteCardListener deleteCardListener) { this.deleteCardListener = deleteCardListener; } @Override public int getCount() { return adapterDate.size(); } @Override public Object getItem(int position) { return adapterDate.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater layoutInflater = LayoutInflater.from(context); convertView = layoutInflater.inflate(R.layout.item_login_account, null); if (convertView != null) { TextView tv_login_account = (TextView) convertView.findViewById(R.id.tv_login_account); tv_login_account.setText(FormatUtil.formatePhoneNumberHide(adapterDate.get(position))); ImageView iv_delete = (ImageView) convertView.findViewById(R.id.iv_delete); RelativeLayout list_item = (RelativeLayout) convertView.findViewById(R.id.list_item); iv_delete.setOnClickListener(new MyDeleteOnClickListener(position)); list_item.setOnClickListener(new MyOnClickListener(position)); } return convertView; } public class MyOnClickListener implements View.OnClickListener { private final int position; public MyOnClickListener(int position) { this.position = position; } @Override public void onClick(View v) { if (itemClickLitenner != null) { itemClickLitenner.onClickCallBack(position, v); } } } public void setItemClickLitenner(SpLoginAccountAdapter.ItemClickLitenner itemClickLitenner) { this.itemClickLitenner = itemClickLitenner; } public interface ItemClickLitenner { void onClickCallBack(int position, View view); } public class MyDeleteOnClickListener implements View.OnClickListener { private final int position; public MyDeleteOnClickListener(int position) { this.position = position; } @Override public void onClick(View v) { deleteCardListener.deleteCallbck(position, v); } } public interface DeleteCardListener { void deleteCallbck(int position, View v); } }
下面是未自定义spinner,没有手动调用隐藏方法的情况。
---------------github源码地址---------------------
菜鸟一枚,欢迎大家下面留言指正。大家一起交流学习。
想要跟我一起学习一起成长,请关注我的公众号:程序员持续发展方案