在本文中,您将会了解到关于PopupWindow+RecyclerView实现上下滑动框功能的新资讯,同时我们还将为您解释recycleview上下左右滑动的相关在本文中,我们将带你探索PopupWi
在本文中,您将会了解到关于PopupWindow+RecyclerView实现上下滑动框功能的新资讯,同时我们还将为您解释recycleview上下左右滑动的相关在本文中,我们将带你探索PopupWindow+RecyclerView实现上下滑动框功能的奥秘,分析recycleview上下左右滑动的特点,并给出一些关于Android App使用RecyclerView实现上拉和下拉刷新的方法、Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多、Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部、Android RecyclerView实现下拉列表功能的实用技巧。
本文目录一览:- PopupWindow+RecyclerView实现上下滑动框功能(recycleview上下左右滑动)
- Android App使用RecyclerView实现上拉和下拉刷新的方法
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部
- Android RecyclerView实现下拉列表功能
PopupWindow+RecyclerView实现上下滑动框功能(recycleview上下左右滑动)
本文实例为大家分享了PopupWindow+RecyclerView实现上下滑动框功能的具体代码,供大家参考,具体内容如下
1.新建一个适配器继承自RecyclerView.Adapter
package aud.hik.com.audiorecordtool; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; public class Filelistadapter extends RecyclerView.Adapter<Filelistadapter.ViewHolder> { private final String TAG = "Filelistadapter"; private List<String> mFileList = null; private OnItemClickListener mOnItemClickListener = null; static class ViewHolder extends RecyclerView.ViewHolder{ TextView fileNameView; public ViewHolder(View view) { super(view); fileNameView = (TextView) view.findViewById(R.id.file_name); } } public Filelistadapter(List<String> fileList) { this.mFileList = fileList; } //加载item 的布局 创建ViewHolder实例 @Override public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);//加载view布局文件 ViewHolder holder = new ViewHolder(view); return holder; } //对RecyclerView子项数据进行赋值 @Override public void onBindViewHolder(ViewHolder holder,int position) { if(null == holder) { MyLog.LOGE(TAG,"Holder is null"); return; } final String fileName= mFileList.get(position); MyLog.LOGI(TAG,"filename = "+fileName +"filenameview = "+holder.fileNameView); holder.fileNameView.setText(fileName); final int tempPosition = position; if(null != mOnItemClickListener) { holder.itemView.setonClickListener( new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClickItem(tempPosition,fileName); } }); // holder.itemView.setonLongClickListener( new View.OnLongClickListener() { // @Override // public boolean onLongClick(View v) { // mOnItemClickListener.onLongClick(tempPosition,fileName); // return false; // } // }); } } //返回子项个数 @Override public int getItemCount() { return mFileList.size(); } public interface OnItemClickListener{ void onClickItem( int position,String fileName); // void onLongClickItem( int position,String fileName); } public void setonItemClickListener(OnItemClickListener onItemClickListener ){ this.mOnItemClickListener = onItemClickListener; } }
2.mainactivity中需要调用的方法
private void showPopupWindow(){ View view = LayoutInflater.from(this).inflate(R.layout.pop_window,null); //初始化List数据 mVecFile = getFileName(TEXT_READ); //初始化RecyclerView RecyclerView recyslerview = (RecyclerView) view.findViewById(R.id.recycler_view); //创建linearlayoutmanager 对象 这里使用 linearlayoutmanager 是线性布局的意思 linearlayoutmanager layoutmanager = new linearlayoutmanager(this); //设置RecyclerView 布局 recyslerview.setLayoutManager(layoutmanager); //设置Adapter Filelistadapter adapter = new Filelistadapter(mVecFile); adapter.setonItemClickListener(new Filelistadapter.OnItemClickListener() { // @Override // public void onLongClickItem(int position,String fileName) { // Toast.makeText(AudioRecordActivity.this,"onLongClick事件 您点击了第:"+position+"个Item",Toast.LENGTH_SHORT).show(); // } @Override public void onClickItem(int position,String fileName) { mTextName = fileName; mEdiTxtName.setText(mTextName); String mTextPath = TEXT_READ+"/"+mTextName; // File file = new File(path); Toast.makeText(AudioRecordActivity.this,mTextPath,Toast.LENGTH_SHORT).show(); mList = new ArrayList<>(); try { FileReader fr = new FileReader(mTextPath); BufferedReader br = new BufferedReader(fr);//以行的方式读取文件 String str = null; while(null != (str = br.readLine())) { mList.add(str); MyLog.LOGI(TAG,str); } fr.close(); br.close(); } catch(FileNotFoundException e) { e.printstacktrace(); } catch (IOException e){ e.printstacktrace(); } MyLog.LOGI(TAG,"list size="+mList.size()); if(0 != mList.size()) { mTextView.setText(mList.get(mListIndex)); } else { return; } } }); recyslerview.setAdapter(adapter); //解决Android7.0以上手机的适配问题 PopupWindow popupWindow = new PopupWindow(view,LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT){ @Override public void showAsDropDown(View anchor) { if(Build.VERSION.SDK_INT >= 24){ Rect visibleFrame = new Rect(); anchor.getGlobalVisibleRect(visibleFrame); int height = anchor.getResources().getdisplayMetrics().heightPixels - visibleFrame.bottom; setHeight(height); } 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); } }; ColorDrawable dw = new ColorDrawable(0x10000000); popupWindow.setBackgroundDrawable(dw); popupWindow.setoutsidetouchable(true); popupWindow.setFocusable(true); popupWindow.showAsDropDown(mEdiTxtName); }
3.item.xml
<?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="wrap_content" android:orientation="horizontal" android:background="@color/colorPrimaryDark" android:layout_margin="1dp"> <TextView android:id="@+id/file_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/colorWhite" android:textSize = "30sp"/> </LinearLayout>
4.pop_window.xml
<?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.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:
- Android实现滑动删除操作(PopupWindow)
- Android程序开发之ListView 与PopupWindow实现从左向右滑动删除功能
Android App使用RecyclerView实现上拉和下拉刷新的方法
关于RecyclerView
RecyclerView在Android 5.0以来被引入,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewGroup,并实现了ScrollingView 和 nestedScrollingChild接口,RecyclerView相比ListView,是一次彻底的改变。
RecyclerView比listview更先进更灵活,对于很多的视图它就是一个容器,可以有效的重用和滚动。当数据动态变化的时候请使用它。
RecyclerView使用起来很方便因为它提供:
1、它为item的定位提供一个layoutmanager
2、为item的操作提供一个缺省的animations
3、还可以灵活地定义这个小部件的自定义布局管理器和动画
实现上拉刷新和下拉刷新
布局文件:
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/swipe_refresh_widget" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@null" android:scrollbars="vertical" /> </android.support.v4.widget.SwipeRefreshLayout>
在Activity中引用这个布局并初始化
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget); mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mSwipeRefreshWidget.setColorScheme(R.color.color1,R.color.color2,R.color.color3,R.color.color4); mSwipeRefreshWidget.setonRefreshListener(this); // 这句话是为了,第一次进入页面的时候显示加载进度条 mSwipeRefreshWidget.setProgressViewOffset(false,(int) TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP,24,getResources() .getdisplayMetrics())); mRecyclerView.setonScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView,int newState) { super.onScrollStateChanged(recyclerView,newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { mSwipeRefreshWidget.setRefreshing(true); // 此处在现实项目中,请换成网络请求数据代码,sendRequest ..... handler.sendEmptyMessageDelayed(0,3000); } } @Override public void onScrolled(RecyclerView recyclerView,int dx,int dy) { super.onScrolled(recyclerView,dx,dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } }); mRecyclerView.setHasFixedSize(true); mLayoutManager = new linearlayoutmanager(this); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); adapter = new SampleAdapter(); mRecyclerView.setAdapter(adapter); // 此处在现实项目中,请换成网络请求数据代码,sendRequest ..... handler.sendEmptyMessageDelayed(0,3000); }
SwipeRefreshLayout里面需要注意的Api:
1、setonRefreshListener(OnRefreshListener listener) 设置下拉监听,当用户下拉的时候会去执行回调
2、setColorSchemeColors(int... colors) 设置 进度条的颜色变化,最多可以设置4种颜色
3、setProgressViewOffset(boolean scale,int start,int end) 调整进度条距离屏幕顶部的距离
4、setRefreshing(boolean refreshing) 设置SwipeRefreshLayout当前是否处于刷新状态,一般是在请求数据的时候设置为true,在数据被加载到View中后,设置为false。
RecyclerView的实现:
第一种,下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条
mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mRecyclerView.setonScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView,dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } }); mRecyclerView.setHasFixedSize(true); mLayoutManager = new linearlayoutmanager(this); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); adapter = new SampleAdapter(); mRecyclerView.setAdapter(adapter);
第二种实现下拉刷新用SwipeRefreshLayout 自带的进度条, 上拉刷新用类似ListView的刷新 提示“加载中”等信息。
我们可以给RecyclerView 也添加一个类似FooterView的item。
我们在Adapter中实现:
public class SampleAdapter extends RecyclerView.Adapter<ViewHolder> { private List<Integer> list; private static final int TYPE_ITEM = 0; private static final int TYPE_FOOTER = 1; public List<Integer> getList() { return list; } public SampleAdapter() { list = new ArrayList<Integer>(); } // RecyclerView的count设置为数据总条数+ 1(footerView) @Override public int getItemCount() { return list.size() + 1; } @Override public int getItemViewType(int position) { // 最后一个item设置为footerView if (position + 1 == getItemCount()) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } @Override public void onBindViewHolder(ViewHolder holder,final int position) { if (holder instanceof ItemViewHolder) { ((ItemViewHolder) holder).textView.setText(String.valueOf(list .get(position))); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { if (viewType == TYPE_ITEM) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.list_item_text,null); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); return new ItemViewHolder(view); } // type == TYPE_FOOTER 返回footerView else if (viewType == TYPE_FOOTER) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.footerview,LayoutParams.WRAP_CONTENT)); return new FooterViewHolder(view); } return null; } class FooterViewHolder extends ViewHolder { public FooterViewHolder(View view) { super(view); } } class ItemViewHolder extends ViewHolder { TextView textView; public ItemViewHolder(View view) { super(view); textView = (TextView) view.findViewById(R.id.text); } } }
这样我们就可以针对footerview的布局做一些处理了,比如提示“加载中,”,“已经全部加载”等信息。更加灵活一点
Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
简介
LRecyclerView是支持addHeaderView、 addFooterView、下拉刷新、分页加载数据的RecyclerView。
它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView、FooterView,并且不需要对你的Adapter做任何修改。
主要功能
下拉刷新、滑动到底部自动加载下页数据;
可以方便添加Header和Footer;
头部下拉样式可以自定义;
具备item点击和长按事件。
网络错误加载失败点击Footer重新请求数据;
可以动态为FooterView赋予不同状态(加载中、加载失败、滑到最底等)。
项目地址:https://github.com/jdsjlzx/LR...
感谢
如果我比别人看得远些,那是因为我站在巨人们的肩上。 (牛顿)
本开源控件是基于 HeaderAndFooterRecyclerView 开源项目而来,在原基础上进行了扩充。在此感谢cundong作者(github地址:https://github.com/cundong)。
效果图
Gradle
Step 1. 在你的根build.gradle文件中增加JitPack仓库依赖。
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
Step 2. 在你的model的build.gradle文件中增加LRecyclerView依赖。
compile ''com.github.jdsjlzx:LRecyclerView:1.0.0''
使用
添加HeaderView、FooterView
mDataAdapter = new DataAdapter(this);
mDataAdapter.setData(dataList);
mLRecyclerViewAdapter = new LRecyclerViewAdapter(this, mDataAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//add a HeaderView
RecyclerViewUtils.setHeaderView(mRecyclerView, new SampleHeader(this));
//add a FooterView
RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter(this));
注意:
mLRecyclerViewAdapter = new LRecyclerViewAdapter(this, mDataAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);
LRecyclerViewAdapter提供了一些实用的功能,使用者不用关心它的实现,只需构造的时候把自己的mDataAdapter以参数形式传进去即可。
下拉刷新和加载更多
为了大家使用方便,将需要用的方法统一封装到接口LScrollListener中。
mRecyclerView.setLScrollListener(new LRecyclerView.LScrollListener() {
@Override
public void onRefresh() {
}
@Override
public void onScrollUp() {
}
@Override
public void onScrollDown() {
}
@Override
public void onBottom() {
}
@Override
public void onScrolled(int distanceX, int distanceY) {
}
});
LScrollListener实现了nRefresh()、onScrollUp()、onScrollDown()、onBottom()、onScrolled五个事件,如下所示:
void onRefresh();//pull down to refresh
void onScrollUp();//scroll down to up
void onScrollDown();//scroll from up to down
void onBottom();//load next page
void onScrolled(int distanceX, int distanceY);// moving state,you can get the move distance
onRefresh()——RecyclerView下拉刷新事件;
onScrollUp()——RecyclerView向上滑动的监听事件;
onScrollDown()——RecyclerView向下滑动的监听事件;
onBottom()——RecyclerView滑动到底部的监听事件;
onScrollDown()——RecyclerView正在滚动的监听事件;
加载更多(加载下页数据)
从上面的LScrollListener介绍中就可以看出,实现加载更多只要在onBottom()接口中处理即可。
下拉刷新
为了达到和Listview的下拉刷新效果,本项目没有借助SwipeRefreshLayout控件,而是在自定义RecyclerView头部实现的刷新效果。
这里的下拉刷新效果借鉴了开源库:AVLoadingIndicatorView
设置加载样式:
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
AVLoadingIndicatorView库有多少效果,LRecyclerView就支持多少下拉刷新效果,当然你也可以自定义下拉效果。
效果图:
下拉刷新逻辑处理:
从上面的LScrollListener介绍中就可以看出,实现下拉刷新只要在onRefresh()接口中处理即可。
加载网络异常处理
加载数据时如果网络异常或者断网,LRecyclerView为你提供了重新加载的机制。
效果图:
网络异常出错代码处理如下:
RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, getPageSize(), LoadingFooter.State.NetWorkError, mFooterClick);
private View.OnClickListener mFooterClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, getPageSize(), LoadingFooter.State.Loading, null);
requestData();
}
};
上面的mFooterClick就是我们点击底部的Footer时的逻辑处理事件,很显然我们还是在这里做重新请求数据操作。
点击事件和长按事件处理
在Hongyang前辈的博客中有下描述:
Click and LongClick
不过一个挺郁闷的地方就是,系统没有提供ClickListener和LongClickListener。
不过我们也可以自己去添加,只是会多了些代码而已。
实现的方式比较多,你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 当然你也可以通过adapter中自己去提供回调,这里我们选择后者,前者的方式,大家有兴趣自己去实现。
出自:http://blog.csdn.net/lmj62356...
Hongyang大神选择了后者,LRecyclerView早期选择了前者,经过实践总结,在adapter中实现点击事件会好点。
先看下怎么使用:
mHeaderAndFooterRecyclerViewAdapter.setOnItemClickLitener(new OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
}
@Override
public void onItemLongClick(View view, int position) {
}
});
原理就是实现viewHolder.itemView的点击和长按事件。由于代码过多就不贴出来了。
viewHolder.itemView是RecyclerView.Adapter中本身就具有的,不用额外定义。
源码如下:
public static abstract class ViewHolder {
public final View itemView;
int mPosition = NO_POSITION;
int mOldPosition = NO_POSITION;
long mItemId = NO_ID;
int mItemViewType = INVALID_TYPE;
int mPreLayoutPosition = NO_POSITION;
设置空白View(setEmptyView)
mRecyclerView.setEmptyView(view);
注意布局文件:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.github.jdsjlzx.recyclerview.LRecyclerView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<include
android:id="@+id/empty_view"
layout="@layout/layout_empty"
android:visibility="gone"/>
</RelativeLayout>
分享
介绍完了LRecyclerView,似乎还少些什么,对了,那就是adapter了。
为了方便大家使用,分享个封装过的adapter。
public class ListBaseAdapter<T extends Entity> extends RecyclerView.Adapter {
protected Context mContext;
protected int mScreenWidth;
public void setScreenWidth(int width) {
mScreenWidth = width;
}
protected ArrayList<T> mDataList = new ArrayList<>();
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return mDataList.size();
}
public List<T> getDataList() {
return mDataList;
}
public void setDataList(Collection<T> list) {
this.mDataList.clear();
this.mDataList.addAll(list);
notifyDataSetChanged();
}
public void addAll(Collection<T> list) {
int lastIndex = this.mDataList.size();
if (this.mDataList.addAll(list)) {
notifyItemRangeInserted(lastIndex, list.size());
}
}
public void clear() {
mDataList.clear();
notifyDataSetChanged();
}
}
ListBaseAdapter使用了泛型,简单方便,消除了强制类型转换。
使用如下:
private class DataAdapter extends ListBaseAdapter<ItemModel>{
private LayoutInflater mLayoutInflater;
public DataAdapter(Context context) {
mLayoutInflater = LayoutInflater.from(context);
mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(mLayoutInflater.inflate(R.layout.sample_item_text, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemModel item = mDataList.get(position);
ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.textView.setText(item.title);
}
private class ViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public ViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.info_text);
}
}
}
ListBaseAdapter虽然功能不强大,但是使用很方便。
结语
LRecyclerView使用方便简单,无论你添加多少Header和Footer,你都不用担心position的问题,除了方便还是方便。
最后再介绍下项目地址:https://github.com/jdsjlzx/LR...
如果觉得上面的例子UI简单,这里再分享个公司项目:https://github.com/jdsjlzx/Co...
效果图:
如果大家使用过程中有任何问题,请留言,我会及时修正。
后记:如果后续再增加功能,请详细看github上面的项目介绍,将不在博客里面更新。
Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部
志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。
如果你有兴趣 你可以关注一下公众号 biglead 来获取最新的学习资料。
-
Flutter 从入门 到精通系列文章在这里
-
系列学习教程在这里
在 Anddroid 中,RecyclerView 可以用来实现 列表 、九宫格、瀑布流效果。
本文章实现的效果,主要是 RecyclerView 滑动的代码分享
向下一个一个滑动
这里使用到的 phoneBeanList 是我 recyclerView 中显示的数据集合。
/**
* 向下一个一个滑动
*/
private void scrollToNextFunction() {
//获取当前显示的View 的数据
int childCount = recyclerView.getChildCount();
//获取最后一具 Item 对应的View
View childAt = recyclerView.getChildAt(childCount - 1);
//获取当前军舰中显示的最后一个 Item 的位置 Postion
int childLayoutPosition = recyclerView.getChildLayoutPosition(childAt);
//如果不是最后一个就向下滑动
if(childLayoutPosition<phoneBeanList.size()-2){
recyclerView.smoothScrollToPosition(childLayoutPosition+1);
}else{
Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show();
}
}
向上一个一个滑动
/**
* 向上一个一个滑动
*/
private void scrollToTopFunction() {
//获取当前视图中显示的第一个 Item 的位置 Position
int childLayoutPosition = recyclerView.getChildLayoutPosition(recyclerView.getChildAt(0));
if (childLayoutPosition > 0) {
recyclerView.smoothScrollToPosition(childLayoutPosition - 1);
} else {
Toast.makeText(this, "已滑动到顶部了", Toast.LENGTH_LONG).show();
}
}
滑动到顶部 置顶
/**
* 滑动到顶部 置顶
*/
private void scrollTopFunction() {
recyclerView.smoothScrollToPosition(0);
}
本文同步分享在 博客 “早起的年轻人”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
Android RecyclerView实现下拉列表功能
现在市面上的很多的应用,都带有下拉列表的功能,将所有选项都放在下拉列表中,当用户点击选择的时候,弹出所有的选项,用户选择一项后,下拉列表自动隐藏,很多下拉列表都是用ListView + PopupWindow来实现的,由于Google推出了替代ListView的RecyclerView,所以简单实现一下:
MainActivity.java
package com.jackie.countdowntimer; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.os.CountDownTimer; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.PopupWindow; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText mNumberEditText; private ImageButton mSelectimageButton; private PopupWindow mPopupWindow; private RecyclerView mRecyclerView; private RecyclerViewAdapter mRecyclerViewAdapter; private List<String> mNumberList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setonClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view,"Replace with your own action",Snackbar.LENGTH_LONG) .setAction("Action",null).show(); } }); //初始化数据 mNumberList = new ArrayList<>(); for (int i = 0; i < 30; i++) { mNumberList.add("1000000" + i); } mNumberEditText = (EditText) findViewById(R.id.number); mSelectimageButton = (ImageButton) findViewById(R.id.select_number); mSelectimageButton.setonClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.select_number: showSelectNumberPopupWindow(); break; } } /** * 弹出选择号码的对话框 */ private void showSelectNumberPopupWindow() { initRecyclerView(); mPopupWindow = new PopupWindow(mRecyclerView,mNumberEditText.getWidth() - 4,200); mPopupWindow.setoutsidetouchable(true); // 设置外部可以被点击 mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); mPopupWindow.setFocusable(true); // 使PopupWindow可以获得焦点 // 显示在输入框的左下角 mPopupWindow.showAsDropDown(mNumberEditText,2,-5); } /** * 初始化RecyclerView,模仿ListView下拉列表的效果 */ private void initRecyclerView(){ mRecyclerView = new RecyclerView(this); //设置布局管理器 mRecyclerView.setLayoutManager(new linearlayoutmanager(this)); mRecyclerView.setBackgroundResource(R.drawable.background); //设置Adapter mRecyclerViewAdapter = new RecyclerViewAdapter(this,mNumberList); mRecyclerView.setAdapter(mRecyclerViewAdapter); //设置点击事件 mRecyclerViewAdapter.setonItemClickListener(new RecyclerViewAdapter.OnItemClickListener() { @Override public void onItemClick(View view,int position) { mNumberEditText.setText(mNumberList.get(position)); mNumberEditText.setSelection(mNumberEditText.getText().toString().length()); mPopupWindow.dismiss(); } }); //添加分割线 mRecyclerView.addItemdecoration(new DividerItemdecoration(this,DividerItemdecoration.VERTICAL_LIST)); } }
RecyclerViewAdapter.java
package com.jackie.countdowntimer; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; import java.util.List; /** * Created by Jackie on 2015/12/18. * RecyclerView Adapter */ public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> { private OnItemClickListener mOnItemClickListener; private Context mContext; private List<String> mNumberList; public RecyclerViewAdapter(Context context,List<String> numberList) { this.mContext = context; this.mNumberList = numberList; } public interface OnItemClickListener { void onItemClick(View view,int position); } public void setonItemClickListener(OnItemClickListener onItemClickListener) { this.mOnItemClickListener = onItemClickListener; } @Override public RecyclerViewAdapter.RecyclerViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { RecyclerViewHolder holder = new RecyclerViewHolder(LayoutInflater.from(mContext).inflate(R.layout.number_item,parent,false)); return holder; } @Override public void onBindViewHolder(final RecyclerViewAdapter.RecyclerViewHolder holder,final int position) { holder.numberTextView.setText(mNumberList.get(position)); // 如果设置了回调,则设置点击事件 if (mOnItemClickListener != null) { holder.numberTextView.setonClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(holder.itemView,holder.getLayoutPosition()); } }); } holder.deleteImageButton.setonClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mNumberList.remove(position); //通知刷新 notifyItemRemoved(position); } }); } @Override public int getItemCount() { return mNumberList.size(); } public class RecyclerViewHolder extends RecyclerView.ViewHolder { TextView numberTextView; ImageButton deleteImageButton; public RecyclerViewHolder(View itemView) { super(itemView); numberTextView = (TextView) itemView.findViewById(R.id.number_item); deleteImageButton = (ImageButton) itemView.findViewById(R.id.number_item_delete); } } }
DividerItemdecoration.java
package com.jackie.countdowntimer; /* * copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License,Version 2.0 (the "License"); * limitations under the License. */ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.RecyclerView; import android.view.View; /** * This class is from the v7 samples of the Android SDK. It's not by me! * <p/> * See the license above for details. */ public class DividerItemdecoration extends RecyclerView.Itemdecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = linearlayoutmanager.HORIZONTAL; public static final int VERTICAL_LIST = linearlayoutmanager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemdecoration(Context context,int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setorientation(orientation); } public void setorientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c,RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { drawVertical(c,parent); } else { drawHorizontal(c,parent); } } public void drawVertical(Canvas c,RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c,RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left,bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect,int itemPosition,RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0,mDivider.getIntrinsicHeight()); } else { outRect.set(0,mDivider.getIntrinsicWidth(),0); } } }
效果图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
我们今天的关于PopupWindow+RecyclerView实现上下滑动框功能和recycleview上下左右滑动的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android App使用RecyclerView实现上拉和下拉刷新的方法、Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多、Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部、Android RecyclerView实现下拉列表功能的相关信息,请在本站查询。
本文标签: