我们经常会使用到Recyclerview来显示列表内容,有时候我们需要删除某一项,这时候我们会选择长按,长按后的弹窗可以使用PopUpWindow来实现(由于需要数据交互更新,我这里没有做数据的删除,只是实现前端界面样式)。
首先创建了一个LinearLayout,里面包含两个TextView作为弹出界面的布局,这里不写了。
之后实现一个PopUpWindow:
public class RecyclerViewPopWindow extends PopupWindow implements View.OnClickListener{
private View contentView;
private TextView pop_delete;
private TextView pop_test;
private Context mContext;
private boolean flag;
public RecyclerViewPopWindow(Activity context){
this.mContext = context;
//获取系统服务(Layout Inflater的服务)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//设置长按之后PopUpWindow的布局样式
contentView = inflater.inflate(R.layout.pop_window_layout, null);
//设置该布局
this.setContentView(contentView);
//在布局文件中设置了两个TextView作为测试
pop_delete = contentView.findViewById(R.id.pop_delete);
pop_test = contentView.findViewById(R.id.pop_test);
//获取屏幕高度宽度
int height = context.getWindowManager().getDefaultDisplay().getHeight();
int width = context.getWindowManager().getDefaultDisplay().getWidth();
//设置高度宽度
this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
this.setWidth(width / 3);
//设置该PopUpWindow是否可以点击
this.setFocusable(true);
//设置该PopUpWindow外的地方是否可以点击(就是点击其他位置使窗口消失)
this.setOutsideTouchable(true);
//刷新PopUpWindow状态
this.update();
//实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0000000000);
//设置背景颜色
this.setBackgroundDrawable(dw);
pop_delete.setOnClickListener(this);
pop_test.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.pop_delete:
//实现接口中的操作,这样我们可以在Recyclerview所在的活动中进行数据操作,而无需转入该类。
iRecycler.getRecycler(1);
dismiss();
break;
case R.id.pop_test:
iRecycler.getRecycler(2);
dismiss();
break;
default:
break;
}
}
private IRecycler iRecycler;
public void setIRecycler(IRecycler iRecycler){
this.iRecycler = iRecycler;
}
//实现一个接口
public interface IRecycler{
public void getRecycler(int i);
}
//显示PopUpWindow
public void showPopWindow(View parent){
if(!this.isShowing()){
//以下拉方式显示PopUpWindow
this.showAsDropDown(parent, parent.getLayoutParams().width/2,5);
}else {
this.dismiss();
}
}
}
在包含有Recyclerview的一个类中进行修改代码(这里Recyclerview的代码不发了)
public class FirstFragment extends Fragment implements RecyclerViewPopWindow.IRecycler{
private RecyclerView recyclerView;
private List<RecyclerViewListItemEntity> viewData = new ArrayList<RecyclerViewListItemEntity>();
private RecyclerViewAdapter scenAdapter;
private View view;
private int pop_position = -1;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//避免同一activity下 多个fragment 切换时重复执行onCreateView方法
// Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。
if (view == null) {
view = inflater.inflate(R.layout.first_fragment, container, false);
} else {
ViewGroup parent = (ViewGroup) view.getParent();
if (null != parent) {
parent.removeView(view);
}
}
//添加数据的函数(这里的数据就随意添加了)
initData();
recyclerView = view.findViewById(R.id.recyclerView);
//添加布局管理(这里有多重布局,实现效果也不同,比如Gridlayout)
final LinearLayoutManager layoutManager = new LinearLayoutManager(view.getContext());
recyclerView.setLayoutManager(layoutManager);
//添加recyclerview的适配器
scenAdapter = new RecyclerViewAdapter(view.getContext(), viewData);
recyclerView.setAdapter(scenAdapter);
//设置每一项中的分割线
recyclerView.addItemDecoration(new DividerItemDecoration(view.getContext(),
DividerItemDecoration.VERTICAL_LIST));
//设置监听事件
scenAdapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(view.getContext(),"on click line " + position,Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(int position) {
RecyclerViewPopWindow popWindow = new RecyclerViewPopWindow(getActivity());
//这里需要使用选中的item的view来进行showPopWindow
View pop_view = layoutManager.findViewByPosition(position);
popWindow.showPopWindow(pop_view);
//设置点击后的事件
popWindow.setIRecycler(FirstFragment.this);
pop_position = position;
}
});
return view;
}
private void initData() {
viewData.add(new RecyclerViewListItemEntity("happy","123456"));
viewData.add(new RecyclerViewListItemEntity("sad","156816"));
viewData.add(new RecyclerViewListItemEntity("anger","555555"));
viewData.add(new RecyclerViewListItemEntity("excite","789498"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
viewData.add(new RecyclerViewListItemEntity("diss","151965"));
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
//重写点击弹出菜单后的操作
@Override
public void getRecycler(int i) {
if(i == 1){
Toast.makeText(view.getContext(),"Delete",Toast.LENGTH_SHORT).show();
}else if(i == 2){
Toast.makeText(view.getContext(), "test",Toast.LENGTH_SHORT).show();
viewData.remove(pop_position);
scenAdapter.notifyDataSetChanged();
}
}
}