GVKun编程网logo

android – 如何在RecyclerView上增加当前焦点项的大小?

8

如果您对android–如何在RecyclerView上增加当前焦点项的大小?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于android–如何在RecyclerView上

如果您对android – 如何在RecyclerView上增加当前焦点项的大小?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于android – 如何在RecyclerView上增加当前焦点项的大小?的详细内容,并且为您提供关于Android RecyclerView上拉加载和下拉刷新、Android StickHeaderRecyclerView - 让recyclerview头部固定、android – RecyclerView里面的RecyclerView并不顺利、android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图的有价值信息。

本文目录一览:

android – 如何在RecyclerView上增加当前焦点项的大小?

android – 如何在RecyclerView上增加当前焦点项的大小?

我正在尝试用RecyclerView创建一个水平列表,当我把焦点放在一个项目上时,增加它的大小.我想这样做:

Increased item effect

你有什么想法来实现这个目标吗?

解决方法:

我想象的是这样的:

>创建水平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上拉加载和下拉刷新

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头部固定

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并不顺利

android – RecyclerView里面的RecyclerView并不顺利

在RecyclerView中有一些关于RecyclerView的主题,但我发现它们中的大多数都不适合我的情况.我的情况是我有一个RecyclerView(垂直线性布局管理)显示一个CardView列表,每个Cardview包含一个内部的RecyclerView(水平线性布局管理).问题在于滚动时的性能,它根本不是平滑的.我注意到如果我为内部Recyclerview评论setAdapter,scrooling变得平滑,但我让CardView没有更新新列表.代码与此类似:

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中的回收视图

android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图

情况如下:RecyclerView项目视图具有复杂的布局.

在某些时候,我这样修改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()但旧的视图重新出现.

解决方法

要防止RecyclerView缓存分离但未回收的视图,请使用:
mRecyclerView.setItemViewCacheSize(0)

另一个稍微激进的方法是为你希望缓存的项调用notifyDataSetChanged()或notifyItemChanged() – 这将强制它们被回收,你将能够在onBindViewHolder()中更新它们

关于android – 如何在RecyclerView上增加当前焦点项的大小?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android RecyclerView上拉加载和下拉刷新、Android StickHeaderRecyclerView - 让recyclerview头部固定、android – RecyclerView里面的RecyclerView并不顺利、android – RecyclerView:如何清除RecyclerView.RecycledViewPool中的回收视图等相关知识的信息别忘了在本站进行查找喔。

本文标签: