PopupWindow+ReycyclerView打造优雅的下拉列表


基类:

package com.baize.spirit.widgt;

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.PopupWindow;



/**
 * 下拉列表基类
 *
 * Created by lxb on 2017/6/9.
 */

public abstract class BasePopWindow extends PopupWindow {

    private Context mContext;

    public BasePopWindow(Context context) {
        super(context);
        mContext = context;
    }



    protected View initLayout(int layoutId) {
        View view = LayoutInflater.from(mContext).inflate(layoutId, null);
        //setContentView(view);
        return view;
    }

    protected void setBackground(int colorId){
        ColorDrawable dw = new ColorDrawable(ContextCompat.getColor(mContext,colorId));
        setBackgroundDrawable(dw);
    }

    protected void setSize(int width,int height){
        setWidth(width);
        setHeight(height);
    }

    @Override
    public void dismiss() {
        super.dismiss();

    }

    /**
     * 设置布局文件子类
     *
     * @return
     */
    protected abstract int setLayout();
}

需要使用的popwindo这里会添加 布局文件,同时将reycyclerView添加进来:FocusMorePopWindow

package com.baize.spirit.activity.focusmore;

import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup.LayoutParams;

import com.baize.spirit.R;
import com.baize.spirit.activity.focusmore.control.FocusMoreAdapter;
import com.baize.spirit.activity.focusmore.model.FocusMoreEntity;
import com.baize.spirit.utils.BZLog;
import com.baize.spirit.widgt.BasePopWindow;

/**
 * 下位列表
 * <p>
 * Created by lxb on 2017/6/9.
 */

public class FocusMorePopWindow extends BasePopWindow {

    private Context mContext;
    private RecyclerView mRecyclerView;
    private FocusMoreAdapter mFocusMoreAdapter;
    private static FocusMorePopWindow focusMorePopWindow;
    private int[] mIcons = {R.drawable.ctrl_home_status, R.mipmap.dir_left, R.mipmap.dir_left_press};
    private int[] mTitle = {R.string.str_game_control, R.string.str_wificonnectting_tips, R.string.str_appsotre};

    public static FocusMorePopWindow getInstance(Context context) {

        if (focusMorePopWindow == null) {
            focusMorePopWindow = new FocusMorePopWindow(context);
        }
        return focusMorePopWindow;
    }

    public FocusMorePopWindow(Context context) {
        super(context);
        mContext = context;
        init();
    }


    private void init() {
        View view = super.initLayout(setLayout());
        setContentView(view);
        initView(view);
        setFocusable(true);
        setSize(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    }

    private void initView(View view) {

        mRecyclerView = (RecyclerView) view.findViewById(R.id.more_recyclerView);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this.mContext, 3));
        mFocusMoreAdapter = new FocusMoreAdapter(this.mContext);
        mFocusMoreAdapter.getDataList().clear();
        for (int i = 0; i < mIcons.length; i++) {
            FocusMoreEntity moreItem = new FocusMoreEntity();
            moreItem.setImgId(mIcons[i]);
            moreItem.setText(this.mContext.getString(mTitle[i]));
            mFocusMoreAdapter.addData(moreItem);
        }
        mFocusMoreAdapter.notifyDataSetChanged();
        mRecyclerView.setAdapter(mFocusMoreAdapter);

    }


    @Override
    protected int setLayout() {
        return R.layout.spiner_focus_more;
    }

    @Override
    public void dismiss() {
        super.dismiss();
        onRecycRes();
    }

    private void onRecycRes(){
        mIcons = null;
        mTitle = null;
        mRecyclerView = null;
        mFocusMoreAdapter = null;
    }
}


下面是recycyclerview部分:先来看看基类适配器:

package com.baize.spirit.bluetoothlist.control;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;


import com.baize.spirit.bluetoothlist.model.BaseData;
import com.baize.spirit.bluetoothlist.view.EmptyView;
import com.baize.spirit.bluetoothlist.view.ViewHolder;
import com.baize.spirit.constant.Constant;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Created by lxb on 2017/2/8.
 */
public class RecyclerViewBaseAdapter extends RecyclerView.Adapter<ViewHolder> {


    protected Context context;
    private List<BaseData> dataList;

    public RecyclerViewBaseAdapter(Context context) {
        this.context = context;
    }

    public void addData(List<? extends BaseData> append) {
        getDataList().addAll(append);
    }

    public void appendData(List<? extends BaseData> append){
       getDataList().addAll(union(getDataList(),append));
    }

    public void appendData(BaseData BaseData){
        getDataList().add(BaseData);
    }

    /**
     * 获取列表并集
     *
     * @param list1
     * @param list2
     * @return
     */
    private List<BaseData> union(List<? extends BaseData> list1,List<? extends BaseData> list2){
        Set<BaseData> mTmp = new HashSet<>();
        mTmp.addAll(list1);
        mTmp.addAll(list2);

        List<BaseData> newList = new ArrayList<>();
        newList.addAll(mTmp);
        return newList;
    }

    public void addData(BaseData vhModel) {
        List<BaseData> list = new ArrayList<>();
        list.add(vhModel);
        addData(list);
    }

    public void clean() {
        getDataList().clear();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if (viewType == Constant.EMPTY_TIPS) {

            return new EmptyView(context, parent);
        }

        return null;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.setData(getDataList().get(position));
    }

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

    /**
     * 获取视图类型,从数据中获取
     * 即从数据中设定一个类型用来区分不同的视图
     *
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        return getDataList().get(position).getItemType();
    }

    public List<BaseData> getDataList() {
        if (dataList == null) {
            dataList = new ArrayList<>();
        }
        return dataList;
    }

}

里面有详细注释就不再解释了。下面给出下拉列表用到的适配器:

package com.baize.spirit.activity.focusmore.control;

import android.content.Context;
import android.view.ViewGroup;

import com.baize.spirit.activity.focusmore.view.FocusMoreView;
import com.baize.spirit.bluetoothlist.control.RecyclerViewBaseAdapter;
import com.baize.spirit.bluetoothlist.view.ViewHolder;
import com.baize.spirit.constant.Constant;

/**
 * 焦点页面下拉列表更多适配器
 *
 * Created by lxb on 2017/6/9.
 */

public class FocusMoreAdapter extends RecyclerViewBaseAdapter {

    private Context mContext;

    public FocusMoreAdapter(Context context) {
        super(context);
        this.mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if (viewType == Constant.FOCUS_MORE) {
            return new FocusMoreView(this.context, parent);
        }

        return super.onCreateViewHolder(parent, viewType);
    }
}

数据部分:数据基类主要扩展一个接口用来表明的不同数据类型,方便创建不同的视图:

package com.baize.spirit.bluetoothlist.model;

import com.baize.spirit.bluetoothlist.pubinterface.ViewDataType;

/**
 * 数据基类,主要扩展接口用
 * Created by lxb on 2017/3/24.
 */

public class BaseData implements ViewDataType{

    /**
     * 子类需要重载
     * @return
     */
    @Override
    public int getItemType() {
        return 0;
    }
}

package com.baize.spirit.bluetoothlist.pubinterface;

/**
 * 视图数据类型,用来 区分不同的视图
 * Created by lxb on 2017/2/8.
 */
public interface ViewDataType {
    int getItemType();
}

下拉列表使用到的数据实体:


package com.baize.spirit.activity.focusmore.model;

import com.baize.spirit.bluetoothlist.model.BaseData;
import com.baize.spirit.constant.Constant;

/**
 * 焦点控制页面更多数据实体
 * Created by lxb on 2017/6/9.
 */

public class FocusMoreEntity extends BaseData {

    private int ImgId;
    private String text;

    public int getImgId() {
        return ImgId;
    }

    public void setImgId(int imgId) {
        ImgId = imgId;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @Override
    public int getItemType() {
        return Constant.FOCUS_MORE;
    }
}

视图部分:先看看recycyerView利用的ViewHolder:

package com.baize.spirit.bluetoothlist.view;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by lxb on 2017/2/8.
 */
public abstract class ViewHolder<T> extends RecyclerView.ViewHolder {
    protected Context mContext;

    public ViewHolder(Context context, ViewGroup parent, int layoutId) {
        super(LayoutInflater.from(context).inflate(layoutId, parent, false));
        mContext = context;
        findView(itemView);
    }

    public ViewHolder(View itemView) {
        super(itemView);
    }

    /**
     * 设置数据的接口,即将数据与View联系起来
     *
     * @param data
     */
    public abstract void setData(T data);

    /**
     * 与适配器对应的控件初始化操作,需要子类扩展
     *
     * @param itemView
     */
    public abstract void findView(View itemView);


}




下拉列表选择视图,这里会获取到下拉列表每个item的引用,并作初始化:

package com.baize.spirit.activity.focusmore.view;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.baize.spirit.R;
import com.baize.spirit.activity.focusmore.model.FocusMoreEntity;


import com.baize.spirit.bluetoothlist.view.ViewHolder;
import com.baize.spirit.utils.BZLog;

/**
 * 焦点控制页面下拉列表更多选项视图
 * <p>
 * Created by lxb on 2017/6/9.
 */

public class FocusMoreView extends ViewHolder<FocusMoreEntity> {

    private ImageView icon;
    private TextView text;
    private FocusMoreEntity focusMoreEntity;

    public FocusMoreView(Context context, ViewGroup parent) {
        super(context, parent, R.layout.focus_more_item);
        mContext = context;

    }

    @Override
    public void setData(FocusMoreEntity data) {
        if (focusMoreEntity != data) {
            focusMoreEntity = data;
            icon.setBackgroundResource(focusMoreEntity.getImgId());
            text.setText(focusMoreEntity.getText());
            icon.setOnClickListener(new EventClick(focusMoreEntity.getText()));

        }
    }

    @Override
    public void findView(View itemView) {
        icon = (ImageView) itemView.findViewById(R.id.img_more_icon);
        text = (TextView) itemView.findViewById(R.id.txt__more_text);
    }

    private class EventClick implements View.OnClickListener {

        private String cmd;

        public EventClick(String cmd) {
            this.cmd = cmd;
        }

        @Override
        public void onClick(View v) {

        }
    }
}


focus_more_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/img_more_icon"
        android:layout_width="43dp"
        android:layout_height="39dp"
        android:scaleType="fitXY" />

    <TextView
        android:id="@+id/txt__more_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="game"/>

</LinearLayout>


spiner_focus_more
布局文件代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_DEDEDE"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/more_recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>


</LinearLayout>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值