如何获取recyclerview做瀑布流瀑布流样式下滑动到底的状态

实现两列的瀑布流效果(每个item的高度是不一样的),向下滑动加载数据后,再向上滑,会出现item位置交换的问题!请问该怎么解决呢..
mStaggeredLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
已有帐号?
无法登录?
社交帐号登录
安卓开发者Android 5.0 开始引入了&。
RecyclerView组件 是一个实现列表的组件,可以实现原来的 ListView, GridView,性能更好。
RecyclerView的使用
和ListView一样,使用RecyclerView需要提供一个Adapter。不一样的是还需要提供一个Layout Manager。
Adapter:&
继承&&RecyclerView.Adapter&VH extends RecyclerView.ViewHolder&
public class MyAdapter extends RecyclerView.Adapter&MyAdapter.ViewHolder& {
private String[] dataS
public MyAdapter(String[] dataSet) {
this.dataSet = dataS
public class ViewHolder extends RecyclerView.ViewHolder {
private TextV
public ViewHolder(View itemView) {
super(itemView);
this.textview = (TextView) itemView.findViewById(R.id.text);
public int getItemCount() {
return dataSet.
public void onBindViewHolder(ViewHolder vh, int position) {//用户刷新views
vh.textview.setText(dataSet[position]);
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//用于创建的新views
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.griditem_layout,
parent, false);
ViewHolder vh = new ViewHolder(v);
以前用ListView或者GridView的时候进场会用到 ViewHolder来简化对itemView的操作,现在Google直接把ViewHolder集成到了Adapter中,方便了很多。
新的Adapter中多了两个方法:
&pre name=&code& class=&java&&onCreateViewHolder(ViewGroup parent, int viewType)onBindViewHolder(ViewHolder vh, int position)
其实这两个方法实现了原来Adapter中的getView(int position, View convertView, ViewGroup parent) 方法。
原来是需要判断convertView是否已经创建,没有创建就先创建,创建了的就直接更新界面。
而现在把这些逻辑判断都封装到了layout manager中。只需要实现onCreateViewHolder来实现itemView的创建,onBindViewHolder来实现itemView的更新。
LayoutManager:
LayoutManager的作用:
1、控制itemView在RecyclerView中的布局样式(如ListView样式还是GridView样式)
2、判断何时创建itemView,何时复用itemView
3、调用Adapter创建或者复用itemView 即:onCreateViewHolder和onBindViewHolder
目前提供三种LayoutManager:
1、LinearLayoutManager:实现ListView效果
2、GridLayoutManager:实现GridView效果
3、StaggeredGridLayoutManager:实现瀑布流效果。
也可以通过继承RecyclerView.LayoutManager来自定义一个LayoutManager来实现自己想要的效果。
这里主要来介绍一下,用RecyclerView来时实现瀑布流的做法。
首先是要引入 android support 库&
Android Studio:
在你的app module中的build.gradle的dependencies中添加
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.+'
代码实现:
主Activity布局文件:activity_main.xml:
&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools& android:layout_width=&match_parent&
android:layout_height=&match_parent& android:paddingLeft=&@dimen/activity_horizontal_margin&
android:paddingRight=&@dimen/activity_horizontal_margin&
android:paddingTop=&@dimen/activity_vertical_margin&
android:paddingBottom=&@dimen/activity_vertical_margin& tools:context=&.MainActivity&&
&android.support.v7.widget.RecyclerView
android:id=&@+id/recyclerview&
android:layout_width=&match_parent&
android:layout_height=&match_parent&/&
&/RelativeLayout&&strong&
itemView的布局文件:griditem_layout.xml
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout
android:id=&@+id/layout&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:padding=&16dp&
xmlns:android=&/apk/res/android&&
&TextView xmlns:android=&/apk/res/android&
android:id=&@+id/text&
android:layout_width=&match_parent&
android:layout_height=&wrap_content& /&
&/RelativeLayout&
MainActivity.java:
package com.louisscl.
import android.graphics.C
import android.graphics.R
import android.os.B
import android.support.v7.app.ActionBarA
import android.support.v7.widget.RecyclerV
import android.support.v7.widget.StaggeredGridLayoutM
import android.view.LayoutI
import android.view.M
import android.view.MenuI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.RelativeL
import android.widget.TextV
public class MainActivity extends ActionBarActivity {
private RecyclerView recyclerV
private StaggeredGridLayoutManager staggeredGridLayoutM
private MyA
private String[] dataSet = {//数据源
, &222222&
, &7777777&
, &222222&
, &7777777&
, &222222&
, &7777777&};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,
StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
recyclerView.addItemDecoration(new SpaceItemDecoration(20)); //设置间隔
adapter = new MyAdapter(dataSet);
recyclerView.setAdapter(adapter);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return super.onOptionsItemSelected(item);
public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
public SpaceItemDecoration(int space) {
this.space =
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.left =
outRect.right =
outRect.bottom =
if (parent.getChildPosition(view) == 0) {
outRect.top =
public class MyAdapter extends RecyclerView.Adapter&MyAdapter.ViewHolder& {
private String[] dataS
public MyAdapter(String[] dataSet) {
this.dataSet = dataS
public class ViewHolder extends RecyclerView.ViewHolder {
private TextV
private RelativeLayout relativeL
public ViewHolder(View itemView) {
super(itemView);
this.textview = (TextView) itemView.findViewById(R.id.text);
this.relativeLayout = (RelativeLayout) itemView.findViewById(R.id.layout);
public int getItemCount() {
return dataSet.
public void onBindViewHolder(ViewHolder vh, int position) {
vh.textview.setText(dataSet[position]);
vh.relativeLayout.setBackgroundColor(position % 2 == 0 ? Color.CYAN : Color.YELLOW);
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.griditem_layout,
parent, false);
ViewHolder vh = new ViewHolder(v);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1836次
排名:千里之外如何获取RecyclerView瀑布流样式下滑动到底的状态_百度知道
如何获取RecyclerView瀑布流样式下滑动到底的状态
提问者采纳
////X轴距离float moveY = event:DownX =///case MotionEvent.ACTION_UP;float DownXDownY =&#47.getX() - DownX:float moveX =y轴距离long moveTime = S/long currentMS 获取系统时间float DownYcurrentMS = S/case MotionE移动时间break.getY().getX().currentTimeMillis().currentTimeMillis() - currentMS搜索;&#47.ACTION_MOVE.getY() - DownY;&#47.ACTION_DOWNswitch (action) {case MotionEvent
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用android RecyclerView 做瀑布流, 在往回下滑时,上面之前已经加载了的item 动过去动过来的,显示位置变来变去的 , 这是什么问题啊,求高人~~
layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
防止item 交换位置
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
layoutManager.invalidateSpanAssignments(); //防止第一行到顶部有空白区域
已有帐号?
无法登录?
社交帐号登录如何获取RecyclerView瀑布流样式下滑动到底的状态_百度知道
如何获取RecyclerView瀑布流样式下滑动到底的状态
我有更好的答案
long currentMS 获取系统时间float DownY currentMS = S&#47.getY() - DownY: break: DownX =y轴距离 long moveTime = S case MotionEvent.getX() - DownX.getX().ACTION_MOVE;// case MotionE//float DownX DownY =X轴距离 float moveY = event.currentTimeMillis().getY();移动时间/&#47switch (action) { case MotionE//&#47.ACTION_UP: float moveX =&#47.currentTimeMillis() - currentMS搜索;&#47.ACTION_DOWN
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 recyclerview禁止滑动 的文章

 

随机推荐