基类:
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>