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

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

2017-06-10 17:07 591 查看
基类:

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.
4000
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>


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