Java 修正了使用自定义行为向下滚动Recyclerview时的闪烁效果

Java 修正了使用自定义行为向下滚动Recyclerview时的闪烁效果,java,android,android-recyclerview,behavior,Java,Android,Android Recyclerview,Behavior,我有一段代码在第二次向下滚动视图时遇到了一种奇怪的行为。基本上,应用程序栏布局应该在向下滑动时调整垂直空间的大小,用户应该能够看到整个图像。但当第二次向下滑动时,屏幕开始超快速闪烁。任何帮助都将不胜感激 ItemDetailFragment.java public class ItemDetailFragment extends BaseFragment implements LoaderManager.LoaderCallbacks<Cursor> { priva

我有一段代码在第二次向下滚动视图时遇到了一种奇怪的行为。基本上,应用程序栏布局应该在向下滑动时调整垂直空间的大小,用户应该能够看到整个图像。但当第二次向下滑动时,屏幕开始超快速闪烁。任何帮助都将不胜感激

ItemDetailFragment.java

public class ItemDetailFragment extends BaseFragment implements
        LoaderManager.LoaderCallbacks<Cursor> {

private static final String TAG = ItemDetailFragment.class.getSimpleName();
private static final int LOAD_ITEM = 1002;

@BindView(R.id.photo)
ImageView mItemImageView;
@BindView(R.id.rv_item)
RecyclerView rvItem;
@BindView(R.id.toolbar)
Toolbar toolbar;

private Unbinder unbinder;
private int currentId;
private Cursor mCursor;
private ItemDetailAdapter mAdapter;
private ShareActionProvider mShareActionProvider;

public static Fragment newInstance(int id) {
    ItemDetailFragment detailFragment = new ItemDetailFragment();
    Bundle args = new Bundle();
    args.putInt(Commons.ITEM_ID_KEY, id);
    detailFragment.setArguments(args);
    return detailFragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_detail, container, false);
    unbinder = ButterKnife.bind(this, view);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    currentId = getArguments().getInt(Commons.ITEM_ID_KEY);

    if(isVisible()){
        ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    }

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
    rvItem.setLayoutManager(mLayoutManager);

    mAdapter = new ItemDetailAdapter();
    rvItem.setAdapter(mAdapter);

    getLoaderManager().restartLoader(LOAD_ITEM, null, this);
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        setHasOptionsMenu(isVisible());
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_share, menu);
    MenuItem item = menu.findItem(R.id.menu_item_share);
    mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.menu_item_share:
            Log.d(TAG, "Share");
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return ItemLoader.loadItemById(getContext(), currentId);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    if (!isAdded()) {
        if (cursor != null) {
            cursor.close();
        }
        return;
    }

    mCursor = cursor;
    if (mCursor != null && !mCursor.moveToFirst()) {
        Log.e(TAG, "Error reading item detail cursor");
        mCursor.close();
        mCursor = null;
    }

    String title = mCursor.getString(ItemLoader.Query.TITLE);
    float price = 0;
    String excerpt = mCursor.getString(ItemLoader.Query.EXCERPT);
    mAdapter.swap(new Item(title, price, excerpt));

    loadItemView();
}

private void loadItemView() {
    if (mCursor != null){
        BindingUtils.loadImage(mItemImageView, mCursor.getString(ItemLoader.Query.PHOTO_URL));
    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    mCursor = null;
    loadItemView();
}

}
公共类ItemDetailFragment扩展了BaseFragment实现
LoaderManager.LoaderCallbacks{
私有静态最终字符串标记=ItemDetailFragment.class.getSimpleName();
专用静态最终整数负载\项目=1002;
@BindView(R.id.photo)
ImageView MiteImageView;
@BindView(R.id.rv_项目)
回收项目;
@BindView(R.id.toolbar)
工具栏;
私人无障碍者;
私有int-currentId;
私有游标mCursor;
私有项目适配器mAdapter;
私有ShareActionProvider mShareActionProvider;
公共静态片段newInstance(int-id){
ItemDetailFragment detailFragment=新的ItemDetailFragment();
Bundle args=新Bundle();
args.putInt(Commons.ITEM_ID_KEY,ID);
detailFragment.setArguments(args);
返回详细信息片段;
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@可空
@凌驾
创建视图上的公共视图(LAYOUTINGER充气机,@Nullable ViewGroup container,
@可为空的捆绑包savedInstanceState){
视图=充气机。充气(R.layout.fragment\u详图,容器,错误);
unbinder=ButterKnife.bind(这个,视图);
返回视图;
}
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
super.onActivityCreated(savedInstanceState);
currentId=getArguments().getInt(Commons.ITEM\u ID\u KEY);
if(isVisible()){
((AppCompatActivity)getActivity()).setSupportActionBar(工具栏);
}
RecyclerView.LayoutManager mLayoutManager=新的LinearLayoutManager(getActivity());
rvItem.setLayoutManager(mLayoutManager);
mAdapter=新的ItemDetailAdapter();
rvItem.setAdapter(mAdapter);
getLoaderManager().restartLoader(加载项,null,this);
}
@凌驾
public void setUserVisibleHint(布尔值isVisibleToUser){
super.setUserVisibleHint(isVisibleToUser);
如果(isVisibleToUser){
SetHasOptions菜单(isVisible());
}
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
super.onCreateOptions菜单(菜单,充气机);
充气机。充气(右菜单。菜单共享,菜单);
MenuItem=menu.findItem(R.id.menu\u item\u share);
mShareActionProvider=(ShareActionProvider)MenuItemCompat.getActionProvider(项);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.菜单项共享:
日志d(标记为“共享”);
返回true;
违约:
返回super.onOptionsItemSelected(项目);
}
}
@凌驾
公共无效onDestroyView(){
super.onDestroyView();
unbinder.unbind();
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回ItemLoader.loadItemById(getContext(),currentId);
}
@凌驾
public void onLoadFinished(加载器,光标){
如果(!isAdded()){
如果(光标!=null){
cursor.close();
}
返回;
}
mCursor=光标;
if(mCursor!=null&&!mCursor.moveToFirst()){
Log.e(标记,“读取项目详细信息光标时出错”);
mCursor.close();
mCursor=null;
}
String title=mCursor.getString(ItemLoader.Query.title);
浮动价格=0;
stringextract=mCursor.getString(ItemLoader.Query.extract);
互换(新项目(标题、价格、摘录));
loadItemView();
}
私有void loadItemView(){
if(mCursor!=null){
BindingUtils.loadImage(mItemImageView、mCursor.getString(ItemLoader.Query.PHOTO_URL));
}
}
@凌驾
公共void onLoaderReset(加载器){
mCursor=null;
loadItemView();
}
}
fragment_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<android.support.v7.widget.RecyclerView
    android:id="@+id/rv_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="@dimen/activity_horizontal_margin"
    android:layout_marginEnd="@dimen/activity_horizontal_margin"
    android:clipToPadding="false"
    app:layout_behavior="la.disfruta.disfruta.custom.behaviour.VerticalScrollingBehaviour"/>

<android.support.design.widget.AppBarLayout
    android:id="@+id/barLayout"
    android:layout_width="match_parent"
    android:layout_height="@dimen/app_bar_layout_height"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="@color/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="center"
            android:fitsSystemWindows="true"
            android:background="@color/photo_placeholder"
            android:contentDescription="@string/app_name"
            app:layout_collapseMode="parallax"/>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            android:layout_gravity="bottom"
            app:layout_collapseMode="pin">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/app_name"
                android:src="@drawable/logo" />

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

VerticalScrollingBehavior.java

public class VerticalScrollingBehaviour extends AppBarLayout.ScrollingViewBehavior {

    private static final String TAG = "Behaviour";

    private View mTargetView;
    private View mBanner;
    private View mToolbar;

    private int mInitialHeight;
    private int mExtHeight;
    private int mLastHeight;

    public VerticalScrollingBehaviour(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public VerticalScrollingBehaviour() {
        super();
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof AppBarLayout;
    }

    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) {
        boolean layoutHandler = super.onLayoutChild(parent, child, layoutDirection);
        if(mTargetView == null){
            mTargetView = parent.findViewById(R.id.barLayout);
            mBanner = parent.findViewById(R.id.photo);
            mToolbar = parent.findViewById(R.id.toolbar);
            if(mTargetView != null){
                init(child);
            }
        }
        return layoutHandler;
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target,
                                  int dx, int dy, int[] consumed) {
        mExtHeight = mBanner.getHeight() + mToolbar.getHeight();

        if (mTargetView != null &&
                (dy < 0 && ( child.getTop() >= mInitialHeight && child.getTop() < mExtHeight) ||
                        (dy > 0 && ( child.getTop() > mInitialHeight && child.getTop() <= mExtHeight)  ) )){
            Log.d(TAG, "onNestedPreScroll - Custom Behaviour");
            resize(dy);
        } else {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        }
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target,
                                    float velocityX, float velocityY) {
        return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child,
                                       View directTargetChild, View target, int nestedScrollAxes) {
        return nestedScrollAxes == View.SCROLL_AXIS_VERTICAL;
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target) {
        super.onStopNestedScroll(coordinatorLayout, child, target);
    }

    private void init(View recyclerView){
        recyclerView.setClipToOutline(false);
        mInitialHeight = recyclerView.getTop();
    }

    private void resize(int dy) {
        mLastHeight = mTargetView.getLayoutParams().height + -dy;
        mTargetView.getLayoutParams().height = mLastHeight;
        mTargetView.requestLayout();
    }
}
公共类VerticalScrollingBehavior扩展了AppBarLayout.ScrollingViewBehavior{
私有静态最终字符串TAG=“behavior”;
私有视图;
私人视图姆班纳;
私有视图工具栏;
私人小型飞机;
私人中景高度;
私人住宅;
公共垂直滚动行为(上下文、属性集属性){
超级(上下文,attrs);
}
公共垂直滚动行为(){
超级();
}
@凌驾
公共布尔布局依赖项(协调布局父项、视图子项、视图依赖项){
返回AppBarLayout的依赖实例;
}
@凌驾
公共布尔onLayoutChild(CoordinatorLayoutParent、View-child、int-layoutDirection){
布尔layoutHandler=super.onLayoutChild(父、子、layoutDirection);
如果(mTargetView==null){
mTargetView=parent.findviewbyd(R.id.barLayout);
mBanner=parent.findviewbyd(R.id.photo);
mToolbar=parent.findviewbyd(R.id.toolbar);
如果(mTargetView!=null){
init(儿童);
}
}
返回layouthHandler;
}
@凌驾
public void onNestedPreScroll(CoordinatorLayout CoordinatorLayout,查看子项,查看目标,
int dx,int dy,int[]消耗){
mExtHeight=mBanner.getHeight()+mToolbar.getHeight();
如果(mTargetView!=null&&
(dy<0&(child.getTop()>=mInitialHeight&&child.getTop()(dy>0&&(child.getTop()>mInitialHeight&&child.getTop())是否有解决方案?