GVKun编程网logo

PopupWindow+RecyclerView实现上下滑动框功能(recycleview上下左右滑动)

22

在本文中,您将会了解到关于PopupWindow+RecyclerView实现上下滑动框功能的新资讯,同时我们还将为您解释recycleview上下左右滑动的相关在本文中,我们将带你探索PopupWi

在本文中,您将会了解到关于PopupWindow+RecyclerView实现上下滑动框功能的新资讯,同时我们还将为您解释recycleview上下左右滑动的相关在本文中,我们将带你探索PopupWindow+RecyclerView实现上下滑动框功能的奥秘,分析recycleview上下左右滑动的特点,并给出一些关于Android App使用RecyclerView实现上拉和下拉刷新的方法、Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多、Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部、Android RecyclerView实现下拉列表功能的实用技巧。

本文目录一览:

PopupWindow+RecyclerView实现上下滑动框功能(recycleview上下左右滑动)

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实现上拉和下拉刷新的方法

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实现下拉刷新,滑动到底部自动加载更多

Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多

简介

LRecyclerView是支持addHeaderView、 addFooterView、下拉刷新、分页加载数据的RecyclerView。

它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView、FooterView,并且不需要对你的Adapter做任何修改。

主要功能

  1. 下拉刷新、滑动到底部自动加载下页数据;

  2. 可以方便添加Header和Footer;

  3. 头部下拉样式可以自定义;

  4. 具备item点击和长按事件。

  5. 网络错误加载失败点击Footer重新请求数据;

  6. 可以动态为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 滑动到顶部

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实现下拉列表功能

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实现下拉列表功能的相关信息,请在本站查询。

本文标签: