您的位置:首页 > 运维架构

RecyclerView+PopupWindow实现下拉列表选择效果

2017-10-16 07:58 1156 查看
已适配Android7.0 popuwindow全屏显示问题



实现主要代码:

/**
* Created by miao on 2017/9/29.
* 自定义PopupWindow 实现下拉列表效果
*/

public abstract class SpinerPopWindow<T> extends PopupWindow{
private List<T> datas;
private Context mContext;
private LayoutInflater mInflater;
private RecyclerView recyclerView;
private SpinerAdapter spinerAdapter;
private int itemResId;
private Activity mActivity;
public SpinerPopWindow(Context context,List<T> list,int resId){
this.mContext=context;
this.datas = list;
mInflater = LayoutInflater.from(mContext);
this.itemResId=resId;
mActivity= (Activity) context;
initPopup();
}

/**
* 初始化PopupWindow
*/
private void initPopup(){
View view = mInflater.inflate(R.layout.spiner_window_layout, null);
setContentView(view);
//设置PopupWindow宽高
//设置PopupWindow宽高
WindowManager windowManager = mActivity.getWindowManager();
Display display = windowManager.getDefaultDisplay();
setWidth(display.getWidth());
setHeight(display.getHeight());
//设置背景
ColorDrawable dw = new ColorDrawable(0x60000000);
setBackgroundDrawable(dw);
setOutsideTouchable(true);

recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
//设置布局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
//设置adapter
spinerAdapter=new SpinerAdapter(mContext,datas,itemResId);
recyclerView.setAdapter(spinerAdapter);

}
class SpinerAdapter extends RecyclerView.Adapter<SpinerAdapter.SpinerHolder>{
private List<T> spinerList;
private Context spinerContext;
private LayoutInflater spinerInflater;
private int mResId;
public SpinerAdapter(Context context,List<T> list,int resId){
this.spinerContext=context;
this.spinerList = new ArrayList<>();
this.mResId=resId;
if (spinerList != null) {
this.spinerList.addAll(list);
}
spinerInflater = LayoutInflater.from(spinerContext);
}
public void nodfiyData(List<T> list) {
if (list != null) {
this.spinerList.clear();
this.spinerList.addAll(list);
}
notifyDataSetChanged();
}
@Override
public SpinerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = spinerInflater.inflate(mResId, parent, false);
SpinerHolder holder=new SpinerHolder(view);

return holder;
}

@Override
public void onBindViewHolder(SpinerHolder holder, final int position) {
setData(holder,position);

//条目点击事件
if (mItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mItemClickListener.onItemClick(spinerList.get(position), position);
}
});
}
//长按点击事件
if (mItemLoogClickListener != null) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return mItemLoogClickListener.onItemLongClick(spinerList.get(position), position);
}
});
}
}

@Override
public int getItemCount() {
return spinerList.size();
}

class SpinerHolder extends RecyclerView.ViewHolder{
public SpinerHolder(View itemView) {
super(itemView);
}
public <T extends View> T getView(int id) {
return (T) itemView.findViewById(id);
}
}
//使用接口回调点击事件
private ItemClickListener mItemClickListener;

public void setOnItemClickListener(ItemClickListener itemClickListener) {
this.mItemClickListener = itemClickListener;
}

//使用接口回调点击事件
private ItemLongClickListener mItemLoogClickListener;

public void setOnItemLongClickListener(ItemLongClickListener itemLongClickListener) {
this.mItemLoogClickListener = itemLongClickListener;
}
}

/**
* 给布局设置值
* @param holder
* @param position  对应的位置
*/
public abstract void setData(SpinerAdapter.SpinerHolder holder, int position);

/**
* 刷新数据
* @param list
*/
public void nodfiyData(List<T> list){
if(spinerAdapter!=null){
spinerAdapter.nodfiyData(list);
}
}

/**
* 点击事件
* @param itemClickListener
*/
public void setOnItemClickListener(ItemClickListener itemClickListener){
if(spinerAdapter!=null){
spinerAdapter.setOnItemClickListener(itemClickListener);
}
}

/**
* 长按事件
* @param itemLongClickListener
*/
public void setOnItemLongClickListener(ItemLongClickListener itemLongClickListener){
if(spinerAdapter!=null){
spinerAdapter.setOnItemLongClickListener(itemLongClickListener);
}
}
@Override
public void showAsDropDown(View anchor) {
if(Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
setHeight(h);
}
super.showAsDropDown(anchor);
}

@Override
public void showAsDropDown(View anchor, int xoff, int yoff) {
if(Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
setHeight(h);
}
super.showAsDropDown(anchor, xoff, yoff);
}
/**
* 设置PopupWindow的位置
*
* @param parent
*/
public void showPopupWindow(View parent) {
if (!this.isShowing()) {
this.showAsDropDown(parent, 0, 2);
} else {
this.dismiss();
}
}
}


条目点击事件接口:

/**
* Created by Administrator on 2017/5/28.
* 点击事件接口
*/

public interface ItemClickListener {
void onItemClick(Object obj, int position);


/**
* Created by Administrator on 2017/5/28.
* 长按点击事件接口
*/

public interface ItemLongClickListener {
boolean onItemLongClick(Object obj, int position);
}


调用:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tvItem1, tvItem2, tvItem3;
private List<String> list;
private ListPopu listPopu;
private View line;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
tvItem1 = (TextView) findViewById(R.id.tv_item1);
tvItem2 = (TextView) findViewById(R.id.tv_item2);
tvItem3 = (TextView) findViewById(R.id.tv_item3);
line = findViewById(R.id.line);

tvItem1.setOnClickListener(this);
tvItem2.setOnClickListener(this);
tvItem3.setOnClickListener(this);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (listPopu != null) {
listPopu.dismiss();
listPopu = null;
} else {
if(id ==R.id.tv_item2){
setTextDrawable(R.mipmap.up_icon,tvItem2);
}else if(id ==R.id.tv_item3){
setTextDrawable(R.mipmap.up_icon,tvItem3);
}else if(id ==R.id.tv_item1){
setTextDrawable(R.mipmap.up_icon,tvItem1);
}
getList();
}
}

private void getList() {
listPopu = new ListPopu(this, list, R.layout.spiner_window_layout_item);
//设置PopWindow显示的位置
listPopu.showAsDropDown(line);
//条目点击监听
listPopu.setOnItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(Object obj, int position) {
Toast.makeText(MainActivity.this, list.get(position), Toast.LENGTH_LONG).show();
listPopu.dismiss();
listPopu = null;
}
});
//监听PopupWindow消失
listPopu.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
setTextDrawable(R.mipmap.dow_icon,tvItem1);
setTextDrawable(R.mipmap.dow_icon,tvItem2);
setTextDrawable(R.mipmap.dow_icon,tvItem3);
}
});
}

class ListPopu extends SpinerPopWindow<String> {

public ListPopu(Context context, List<String> list, int resId) {
super(context, list, resId);
}

@Override
public void setData(SpinerAdapter.SpinerHolder holder, int position) {
TextView item = holder.getView(R.id.item);
String s = list.get(position);
item.setText(s);

}
}

/**
* 初始化数据
*/
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("item:" + i);
}
}

/**
* 设置textview右边显示图片
*/
private void setTextDrawable(int imageid, TextView tv) {
Drawable drawable = getResources().getDrawable(imageid);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
tv.setCompoundDrawables(null, null, drawable, null);
}

/**
* 监听物理返回键
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (listPopu != null) {
listPopu.dismiss();
listPopu = null;
return true;
}
}
return super.onKeyDown(keyCode, event);
}
}


源码地址:

http://pan.baidu.com/s/1geFS4zp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息