1. 程式人生 > >RecyclerView+PopupWindow實現下拉列表選擇效果

RecyclerView+PopupWindow實現下拉列表選擇效果

已適配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);
    }
}