如果您对android–如何在RecyclerView上增加当前焦点项的大小?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于android–如何在RecyclerView上
如果您对android – 如何在RecyclerView上增加当前焦点项的大小?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于android – 如何在RecyclerView上增加当前焦点项的大小?的详细内容,并且为您提供关于Android RecyclerView上拉加载和下拉刷新、Android StickHeaderRecyclerView - 让recyclerview头部固定、android – RecyclerView里面的RecyclerView并不顺利、android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图的有价值信息。
本文目录一览:- android – 如何在RecyclerView上增加当前焦点项的大小?
- Android RecyclerView上拉加载和下拉刷新
- Android StickHeaderRecyclerView - 让recyclerview头部固定
- android – RecyclerView里面的RecyclerView并不顺利
- android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图
android – 如何在RecyclerView上增加当前焦点项的大小?
我正在尝试用RecyclerView创建一个水平列表,当我把焦点放在一个项目上时,增加它的大小.我想这样做:
你有什么想法来实现这个目标吗?
解决方法:
我想象的是这样的:
>创建水平RV
>绑定ViewHolder时,将Focuschangelistener附加到项目的根视图
>当项目获得焦点时,将其缩放以使其稍大;当焦点丢失时,恢复动画.
static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View root) {
// bind views
// ...
// bind focus listener
root.setonFocuschangelistener(new View.OnFocuschangelistener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// run scale animation and make it bigger
} else {
// run scale animation and make it smaller
}
}
});
}
}
Android RecyclerView上拉加载和下拉刷新
之前写过一篇刷新加载《RecyclerView上拉加载和下拉刷新(基础版)》 ,这次是进行改装完善。
代码中注释的很详细,所以就直接上代码了。
核心实现
package com.example.fly.recyclerviewrefresh.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.RecyclerView; import com.example.fly.recyclerviewrefresh.R; import java.util.ArrayList; import java.util.List; /** * 类名: * 类描述:下拉刷新和上拉加载 * 创建人:fly * 创建日期: 2017/2/2. * 版本:V1.0 */ public abstract class RefreshActivity<T extends Object,A extends RecyclerView.Adapter> extends BaseActivity implements SwipeRefreshLayout.OnRefreshListener { protected SwipeRefreshLayout swipeRefreshLayout; protected RecyclerView recyclerView; protected linearlayoutmanager linearlayoutmanager; protected A adapter; protected List<T> lists = new ArrayList<>(); protected T dataBeanLoadMore = createBean(); protected boolean isLoadDataIng; // 默认为false 是否正在加载数据, false 不在加载, true 正在加载 protected boolean isScrollY; // 是否在Y轴(垂直方向)上滑动, false 没滑动, true 滑动 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(setLayout()); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); swipeRefreshLayout.setonRefreshListener(this); swipeRefreshLayout.setColorSchemeResources(Refresh.colors); // 设置变化的颜色 recyclerView = (RecyclerView) findViewById(R.id.recyclerView); linearlayoutmanager = new linearlayoutmanager(this); recyclerView.setLayoutManager(linearlayoutmanager); loadMore(); } /**作用就是能在父类中初始化公共的控件如上面的onCreate(@Nullable Bundle savedInstanceState)初始化的控件*/ protected abstract int setLayout(); public abstract T createBean(); // public abstract A createAdapter(); /**上拉加载*/ protected void loadMore() { recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { /** * * @param recyclerView 当前在滚动的RecyclerView * @param newState 当前滚动状态 * newState有三种值: //静止,没有滚动 public static final int SCROLL_STATE_IDLE = 0; //正在被外部拖拽,一般为用户正在用手指滚动 public static final int SCROLL_STATE_DRAGGING = 1; //自动滚动开始 public static final int SCROLL_STATE_SETTLING = 2; */ @Override public void onScrollStateChanged(RecyclerView recyclerView,int newState) { super.onScrollStateChanged(recyclerView,newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && isLoadDataIng == false ) { int lastVisibleItem = linearlayoutmanager.findLastCompletelyVisibleItemPosition(); // 获取最后一个item的角标 int totalItemCount = linearlayoutmanager.getItemCount(); // 获取item的总数 if (lastVisibleItem == (totalItemCount - 1)) { // 判断滑到最后一个item if (!swipeRefreshLayout.isRefreshing()) { //不再下拉刷新状态 if (isScrollY) { // 在Y轴(垂直方向)上有滑动 // Todo 执行上拉加载 onShowRefresh(); loadMoreData(); } } } } } /** * * @param recyclerView 当前滚动的view * @param dx 水平滚动距离 * @param dy 垂直滚动距离 */ @Override public void onScrolled(RecyclerView recyclerView,int dx,int dy) { super.onScrolled(recyclerView,dx,dy); if (dy > 0) { isScrollY = true; }else{ isScrollY = false; } } }); } /**加载数据*/ public abstract void loadMoreData(); /**显示加在更多的View*/ protected void onShowRefresh() { isLoadDataIng = true; // 正在加载数据 lists.add(dataBeanLoadMore); adapter.notifyDataSetChanged(); } /**隐藏加在更多的View*/ protected void onHintLoadMore() { lists.remove(dataBeanLoadMore); isLoadDataIng = false; // 不在加载数据 adapter.notifyDataSetChanged(); } }
package com.example.fly.recyclerviewrefresh; import android.os.Handler; import android.os.Bundle; import com.example.fly.recyclerviewrefresh.adapter.RecyclerAdapter; import com.example.fly.recyclerviewrefresh.base.Refresh; import com.example.fly.recyclerviewrefresh.base.RefreshActivity; import com.example.fly.recyclerviewrefresh.bean.DataBean; /** * 类名: * 类描述:RecyclerView刷新 方法二 * 创建人:fly * 创建日期: 2017/2/2. * 版本:V1.0 */ public class MainActivity extends RefreshActivity<DataBean,RecyclerAdapter>{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); for (int i = 0; i < 20; i++) { DataBean dataBean = new DataBean(Refresh.COMMON); dataBean.number = String.valueOf(i); lists.add(dataBean); } adapter = new RecyclerAdapter(lists,this); recyclerView.setAdapter(adapter); } @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { lists.clear(); adapter.notifyDataSetChanged(); swipeRefreshLayout.setRefreshing(false); } },1000); } @Override protected int setLayout() {return R.layout.activity_main;} @Override public DataBean createBean() {return new DataBean(Refresh.LOAD_MORE);} @Override public void loadMoreData() { for (int i = 0; i < 5; i++) { DataBean dataBean = new DataBean(Refresh.COMMON); dataBean.number = String.valueOf(i) + "fly"; lists.add(dataBean); } adapter.notifyDataSetChanged(); onHintLoadMore(); } }
源码下载:RecyclerViewRefresh刷新加载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
Android StickHeaderRecyclerView - 让recyclerview头部固定
介绍
在项目中有时会需要recyclerview滑动式时某个view滑出后会固定在头部显示,比较常用的比如手机联系人界面、地区选择界面等。 StickHeaderRecyclerView就是实现这个功能的。效果图:
这样的控件网上一抓一大把了,本控件的优点就是使用简单- lib简单 - 使用的语法也简单(之前下了2个类似开源项目,都是上万行代码。读起来麻烦、改起来麻烦就自己写了这个控件)
使用
只需要让你的adapter实现StickHeaderDecoration.StickHeaderInterface接口,方法boolean isStick(int position)中返回的值就标识当前位置的view是否需要固定。
同时需要让Adapter中的item不复用(如果怕影响性能也可以单独让需要固定的view不复用) 在adapter构造方法中setHasStableIds(true); 同时复写adapter的public long getItemId(int position) {return position;}
上代码
public class NormalAdapter extends RecyclerView.Adapter<NormalAdapter.InnerHolder> implements StickHeaderDecoration.StickHeaderInterface{
NormalAdapter(Activity activity, List<String> dates){
this.activity = activity;
this.dates = dates;
}
@Override
public boolean isStick(int position) {
return position % 6 == 0;
}
Activity activity;
private List<String> dates;
@Override
public InnerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(activity).inflate(R.layout.item, parent,
false);
return new InnerHolder(inflate);
}
@Override
public void onBindViewHolder(InnerHolder holder, int position) {
if(isStick(position)){
holder.itemView.setBackgroundResource(R.color.colorAccent);
holder.tvText.setText(position / 6 +"");
}else{
holder.itemView.setBackgroundResource(R.color.white);
holder.tvText.setText(dates.get(position));
}
}
@Override
public int getItemCount() {
return dates.size();
}
class InnerHolder extends RecyclerView.ViewHolder{
TextView tvText;
public InnerHolder(View itemView) {
super(itemView);
tvText = (TextView) itemView.findViewById(R.id.tvText);
}
}
}
activity代码
public class MainActivity extends Activity {
private RecyclerView recycle;
private List<String> dates = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycle = (RecyclerView) findViewById(R.id.recycle);
for(int i=0;i<66;i++){
dates.add("date : "+i);
}
recycle.setLayoutManager(new LinearLayoutManager(this));
recycle.setAdapter(new NormalAdapter(this, dates));
recycle.addItemDecoration(new StickHeaderDecoration(recycle));
}
}
完成了
原理
先上核心类代码
public class StickHeaderDecoration extends RecyclerView.ItemDecoration {
public interface StickHeaderInterface {
/**
* is this item need stick
* @param position now item position in the recyclerView
* @return true : need stick else not
*/
boolean isStick(int position);
}
private RecyclerView recyclerView;
private RecyclerView.LayoutManager manager;
private RecyclerView.Adapter adapter;
private StickHeaderInterface stickHeaderInterface;
/**
* 进行一些容错检查
*/
public StickHeaderDecoration(RecyclerView recyclerView) {
this.recyclerView = recyclerView;
this.manager = recyclerView.getLayoutManager();
this.adapter = recyclerView.getAdapter();
if (adapter == null) {
throw new RuntimeException("please set Decoration after set adapter");
}
if (adapter instanceof StickHeaderInterface) {
stickHeaderInterface = (StickHeaderInterface) adapter;
return;
}
throw new RuntimeException("please make your adapter implements StickHeaderInterface");
}
/**
* 绘制头部的stick view
*/
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
View childAt = parent.getChildAt(0);
if (childAt == null)
return;
RecyclerView.ViewHolder childViewHolder = parent.getChildViewHolder(childAt);
int position = childViewHolder.getPosition();
for (int i = position; i >= 0; i--) {
if (stickHeaderInterface.isStick(i)) {
int top = 0;
if (position + 1 < adapter.getItemCount()) {
if (stickHeaderInterface.isStick(position + 1)) {
View childNext = parent.getChildAt(1);
top = manager.getDecoratedTop(childNext) < 0 ? 0 : manager
.getDecoratedTop(childNext);
}
}
RecyclerView.ViewHolder inflate = recyclerView.getAdapter().createViewHolder(parent,
recyclerView.getAdapter().getItemViewType(i));
recyclerView.getAdapter().bindViewHolder(inflate, i);
int measureHeight = getMeasureHeight(inflate.itemView);
c.save();
if (top < inflate.itemView.getMeasuredHeight() && top > 0) {
c.translate(0, top - measureHeight);
}
inflate.itemView.draw(c);
c.restore();
return;
}
}
}
/**
* 测量控件的高度
*
* @param header
*/
private int getMeasureHeight(View header) {
int widthSpec = View.MeasureSpec.makeMeasureSpec(recyclerView.getWidth(), View
.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
header.measure(widthSpec, heightSpec);
header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());
return header.getMeasuredHeight();
}
}
首先ItemDecoration是一个接口,通过RecyclerView的 recycle.addItemDecoration方法设置进去
其中只有6个方法其中3个过时了。我们这儿只需要对onDrawOver进行操作。
onDrawOver是当前RecyclerView绘制完毕后调用,可以其中进行绘制。我们的头部固定其实就是在这个方法中绘制进去的。
算法
1.这儿我们需要判断当前显示item的前面是否有需要固定的item(这儿取名为beforitem)如果有则绘制在顶部
2.我们还需要当第二个固定的item把前面的item慢慢顶上去的效果,这儿通过判断当前显示的第一个item的下一个item是否需要固定,如果需要则通过manager.getDecoratedTop(childNext)获取这个item距离顶部的距离然后通过计算把beforitem先上移动一定的距离。
基本原理就这样,相信代码更加有说服力,github 地址
https://github.com/LiuLinXin/StickHeaderRecyclerView-philer
待优化
头部view现在是通过ondraw绘制进去的,不能相应点击事件等。暂时没相处好的解决办法,希望有想法的朋友提示下。
android – RecyclerView里面的RecyclerView并不顺利
onBindViewHolder...{ holder.innerRecycler.setAdapter(new InnerAdapter((data)); // comment that line make the outer recyclerview smoothly but the CardView data not updated thanks to the view recycling. }
我知道可滚动视图中的可滚动视图不是一个好主意,但我没有看到任何其他选择.以前有人面对这种布局吗?谢谢.
更新(添加更多代码).
// init outer recyclerview mOuterRecyclerView = (RecyclerView) findViewById(...); mOuterRecyclerView.setLayoutManagement(new LinearLayoutManagement(this)); mOuterRecyclerView.setHasFixedSize(true); mOuterRecyclerView.setAdapter(new Outeradapter(dataList)); // The adapter class for the outer one onBindViewHolder(...){ final dataItem = mItems.get(position); holder.innerRecycler.setAdapter(new InnerAdapter(dataItem.getList())); } // the holder for the outer class MyHolder extends ViewHolder{ RecyclerView innerRecycler; public MyHolder(View view){ super(..); innerRecycler = findViewById(...); } } // the adapter for the inner onBindViewHolder(...){ final dataItem = mItems.get(pos); // async loading holder.tvTitle.setText(dataItem.getTitle); }
布局非常简单,所以我不在这里发布完整的代码.
总结
以上是小编为你收集整理的android – RecyclerView里面的RecyclerView并不顺利全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图
在某些时候,我这样修改RecyclerView项目的布局:
防爆. itemView = 3中修改后的View的索引;
for (int i=0; i < mRecyclerView.getChildCount(); i++) { ViewGroup itemView = ((ViewGroup) mRecyclerView.getChildAt(i)); itemView.getChildAt(3).getLayoutParams().width = newWidth; itemView.getChildAt(3).requestLayout(); }
这一切都按预期工作,但当我滚动RecyclerView时,有2-3个回收的项目视图将以旧的宽度显示.现在我试图找到如何从RecycledViewPool中删除这些视图,甚至是更好的解决方案:修改它们的宽度,但我找不到获取这些视图的方法.
我尝试了mRecyclerView.getRecycledViewPool().clear()但旧的视图重新出现.
解决方法
mRecyclerView.setItemViewCacheSize(0)
另一个稍微激进的方法是为你希望缓存的项调用notifyDataSetChanged()或notifyItemChanged() – 这将强制它们被回收,你将能够在onBindViewHolder()中更新它们
关于android – 如何在RecyclerView上增加当前焦点项的大小?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android RecyclerView上拉加载和下拉刷新、Android StickHeaderRecyclerView - 让recyclerview头部固定、android – RecyclerView里面的RecyclerView并不顺利、android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图等相关知识的信息别忘了在本站进行查找喔。
本文标签: