【问题标题】:Android recycle view animation looks very jumpy when changing to another activity切换到另一个活动时,Android recyclerview 动画看起来很跳跃
【发布时间】:2016-01-18 13:35:55
【问题描述】:

所以我在让我的动画在 Android 的回收视图中正常工作时遇到问题。我正在列表的项目上设置一些动画,然后尝试开始一个新的活动,但回收视图会在进入下一个活动之前重新加载所有视图。我尝试过设置共享过渡,但它看起来仍然很跳跃。

public class ArticleListActivity extends ActionBarActivity implements
        LoaderManager.LoaderCallbacks<Cursor> {

    private int mFadeSleepTime = 16000;
    private int mWordBuffer = 200;//number of words we will display at a time
    private int mMaxChars = 0;
    private int mTotalPages = 0;
    private int mCurrentPage = 0;

    private Toolbar mToolbar;
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private RecyclerView mRecyclerView;
    private ImageView mFAB;
    private int mTextPostion = 0;
    Animation fadeIn = new AlphaAnimation(0.0f, 1.0f);
    Animation fadeOut = new AlphaAnimation(1.0f, 0.0f);
    Animation mNewspaperClipSelectedAnimation;
    Animation mNewspaperClipSlideDownAnimation;
    Adapter mAdapter;
    String mbodyText;
    boolean mEndsInSpace = true;
    boolean mIsAnimating = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_article_list);

        mToolbar = (Toolbar) findViewById(R.id.toolbar);

        final View toolbarContainerView = findViewById(R.id.toolbar_container);
        mFAB = (ImageView) findViewById(R.id.add_to_lib_fab);
        fadeIn.setDuration(2000);
        fadeOut.setDuration(1000);

        fadeOut.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                    final int index = i;
                    View v = mRecyclerView.getChildAt(i);
                    v.findViewById(R.id.article_body).startAnimation(fadeIn);
                    mRecyclerView.invalidate();
                    ArticleListActivity.this.runOnUiThread(new Runnable() {
                        public void run() {
                            mAdapter.notifyItemChanged(index);
                        }
                    });
                }
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        getLoaderManager().initLoader(0, null, this);

        if (savedInstanceState == null) {
            refresh();
        }

        mRecyclerView.setItemAnimator(null);

       /* mFAB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO Add news clip to lib
            }
        });*/

        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    while (true) {
                        sleep(mFadeSleepTime);
                        mTextPostion += mWordBuffer;

                        while (mEndsInSpace) {
                            if (mbodyText.charAt(mTextPostion) != ' ') {
                                mTextPostion += 1;
                            } else {
                                mEndsInSpace = false;
                            }
                        }

                        if (mTextPostion > mMaxChars - mWordBuffer) {
                            mTextPostion = 0;
                            mCurrentPage = -1;
                        }

                        ArticleListActivity.this.runOnUiThread(new Runnable() {
                            public void run() {
                                for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                                    View v = mRecyclerView.getChildAt(i);
                                    v.findViewById(R.id.article_body).startAnimation(fadeOut);
                                }
                                mCurrentPage = mCurrentPage + 1;
                            }
                        });

                        mEndsInSpace = true;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        thread.start();

        mNewspaperClipSelectedAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.newspaper_selected_anim);
        mNewspaperClipSlideDownAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.newspaper_unselected_stories_slide_out);
    }

    private void refresh() {
        startService(new Intent(this, UpdaterService.class));
    }

    @Override
    protected void onStart() {
        super.onStart();
        registerReceiver(mRefreshingReceiver, new IntentFilter(UpdaterService.BROADCAST_ACTION_STATE_CHANGE));
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(mRefreshingReceiver);
    }

    private boolean mIsRefreshing = false;

    private BroadcastReceiver mRefreshingReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (UpdaterService.BROADCAST_ACTION_STATE_CHANGE.equals(intent.getAction())) {
                mIsRefreshing = intent.getBooleanExtra(UpdaterService.EXTRA_REFRESHING, false);
                updateRefreshingUI();
            }
        }
    };

    private void updateRefreshingUI() {
        mSwipeRefreshLayout.setRefreshing(mIsRefreshing);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        return ArticleLoader.newAllArticlesInstance(this);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
        mAdapter = new Adapter(this,cursor);
        mAdapter.setHasStableIds(true);
        mRecyclerView.setAdapter(mAdapter);
        int columnCount = getResources().getInteger(R.integer.list_column_count);
        StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(columnCount, StaggeredGridLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(sglm);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mRecyclerView.setAdapter(null);
    }

    private class Adapter extends RecyclerView.Adapter<ViewHolder> {
        private Cursor mCursor;
        private Context mContext;

        public Adapter(Context context,Cursor cursor) {
            mContext = context;
            mCursor = cursor;
        }

        @Override
        public long getItemId(int position) {
            mCursor.moveToPosition(position);
            return mCursor.getLong(ArticleLoader.Query._ID);
        }

        @Override
        public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
            View view = getLayoutInflater().inflate(R.layout.list_item_article, parent, false);
            final ViewHolder vh = new ViewHolder(view);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View view) {
                    for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                        View v = mRecyclerView.getChildAt(i);
                        v.findViewById(R.id.article_body).startAnimation(fadeOut);
                        v.setAnimation(mNewspaperClipSlideDownAnimation);
                        v.startAnimation(mNewspaperClipSlideDownAnimation);
                    }
                    ExpandingCardViewAnimation animation = new ExpandingCardViewAnimation(getApplicationContext(),parent,view);
                    animation.configureAnimation();
                    view.clearAnimation();
                    view.setAnimation(mNewspaperClipSelectedAnimation);
                    view.startAnimation(mNewspaperClipSelectedAnimation);

                    mNewspaperClipSlideDownAnimation.setAnimationListener(new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            String transitionName = getString(R.string.transition_list_item);
                            Activity activity = (Activity) mContext;
                            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, mRecyclerView,transitionName);
                            ActivityCompat.startActivity(activity, new Intent(Intent.ACTION_VIEW, ItemsContract.Items.buildItemUri(getItemId(vh.getAdapterPosition()))), options.toBundle());
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {

                        }
                    });
                }
            });
            return vh;
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            mCursor.moveToPosition(position);
            holder.titleView.setText(mCursor.getString(ArticleLoader.Query.TITLE));
            holder.subtitleView.setText(
                    DateUtils.getRelativeTimeSpanString(
                            mCursor.getLong(ArticleLoader.Query.PUBLISHED_DATE),
                            System.currentTimeMillis(), DateUtils.HOUR_IN_MILLIS,
                            DateUtils.FORMAT_ABBREV_ALL).toString()
                            + " by "
                            + mCursor.getString(ArticleLoader.Query.AUTHOR));
            holder.thumbnailView.setImageUrl(
                    mCursor.getString(ArticleLoader.Query.THUMB_URL),
                    ImageLoaderHelper.getInstance(ArticleListActivity.this).getImageLoader());
            holder.thumbnailView.setAspectRatio(mCursor.getFloat(ArticleLoader.Query.ASPECT_RATIO));


            mbodyText = mCursor.getString(ArticleLoader.Query.BODY);
            mMaxChars = mbodyText.length();
            mTotalPages = mMaxChars/mWordBuffer;
            holder.bodyView.setText(mbodyText.substring(mTextPostion, mTextPostion + mWordBuffer));

            holder.pagesview.removeAllViews();
            for(int i = 0; i < mTotalPages; i++){
                TextView mPageText = new TextView(getApplicationContext());
                mPageText.setLayoutParams(new RelativeLayout.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT));
                mPageText.setText(Integer.toString(i + 1));
                mPageText.setPadding(10,10,10,0);
                mPageText.setTextSize(19);

                if(mCurrentPage == i)
                    mPageText.setTextColor(getResources().getColor(R.color.highlited_page_color));
                else
                    mPageText.setTextColor(getResources().getColor(R.color.blue_page_number_color));

                holder.pagesview.addView(mPageText);
            }
        }

        @Override
        public int getItemCount() {
            return mCursor.getCount();
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public DynamicHeightNetworkImageView thumbnailView;
        public TextView titleView;
        public TextView subtitleView;
        public TextView bodyView;
        public LinearLayout pagesview;

        public ViewHolder(final View view) {
            super(view);
            thumbnailView = (DynamicHeightNetworkImageView) view.findViewById(R.id.thumbnail);
            titleView = (TextView) view.findViewById(R.id.article_title);
            subtitleView = (TextView) view.findViewById(R.id.article_subtitle);
            bodyView = (TextView) view.findViewById(R.id.article_body);
            pagesview = (LinearLayout) view.findViewById(R.id.newspaper_clip_pages);
        }
    }
}

** 列表项的转换

<?xml version="1.0" encoding="utf-8"?>
<set
    android:shareInterpolator="true"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.0"
        android:fromYScale="1.0"
        android:toYScale="1.4"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true"
        android:duration="1500" />
</set>


<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.0"
        android:duration="1400" />
</set>

【问题讨论】:

    标签: android animation android-recyclerview transitions


    【解决方案1】:

    所以我终于想出了这个问题的答案,我在动画结束时将回收视图的子视图设置为不可见,并设置延迟动画过渡。这是工作代码。

    public class ArticleListActivity extends ActionBarActivity implements LoaderManager.LoaderCallbacks<Cursor> {
    
        private int mFadeSleepTime = 16000;
        private int mWordBuffer = 200;//number of words we will display at a time
        private int mMaxChars = 0;
        private int mTotalPages = 0;
        private int mCurrentPage = 0;
        private Toolbar mToolbar;
        private SwipeRefreshLayout mSwipeRefreshLayout;
        private RecyclerView mRecyclerView;
        private int mTextPostion = 0;
        public int mPagePadding = 10;
        Animation fadeIn = new AlphaAnimation(0.0f, 1.0f);
        Animation fadeOut = new AlphaAnimation(1.0f, 0.0f);
        Animation mNewspaperClipSelectedAnimation;
        Animation mNewspaperClipSlideDownAnimation;
        Adapter mAdapter;
        String mbodyText;
        boolean mEndsInSpace = true;
        CoordinatorLayout mMainContainer;
        private Thread mTextSwitcherThread;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_article_list);
    
            mToolbar = (Toolbar) findViewById(R.id.toolbar);
    
            final View toolbarContainerView = findViewById(R.id.toolbar_container);
            mMainContainer = (CoordinatorLayout) findViewById(R.id.main_coordinator_layout);
            mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
            mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    
            fadeIn.setDuration(2000);
            fadeOut.setDuration(1000);
    
            mRecyclerView.setItemAnimator(null);
            mNewspaperClipSelectedAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.newspaper_selected_anim);
            mNewspaperClipSlideDownAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.newspaper_unselected_stories_slide_out);
    
            fadeOut.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
    
                }
    
                @Override
                public void onAnimationEnd(Animation animation) {
                    for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                        final int index = i;
                        View v = mRecyclerView.getChildAt(i);
                        v.findViewById(R.id.article_body).startAnimation(fadeIn);
                        mRecyclerView.invalidate();
                        ArticleListActivity.this.runOnUiThread(new Runnable() {
                            public void run() {
                                mAdapter.notifyItemChanged(index);
                            }
                        });
                    }
                }
    
                @Override
                public void onAnimationRepeat(Animation animation) {
                }
            });
    
    
            getLoaderManager().initLoader(0, null, this);
    
            if (savedInstanceState == null) {
                refresh();
            }
    
            setTextFadeThread();
        }
    
        private void setTextFadeThread(){
            mTextSwitcherThread = new Thread() {
                @Override
                public void run() {
                    try {
                        while (true) {
                            sleep(mFadeSleepTime);
                            mTextPostion += mWordBuffer;
    
                            while (mEndsInSpace) {
                                if (mbodyText.charAt(mTextPostion) != ' ') {
                                    mTextPostion += 1;
                                } else {
                                    mEndsInSpace = false;
                                }
                            }
    
                            if (mTextPostion > mMaxChars - mWordBuffer) {
                                mTextPostion = 0;
                                mCurrentPage = -1;
                            }
    
                            ArticleListActivity.this.runOnUiThread(new Runnable() {
                                public void run() {
                                    for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                                        View v = mRecyclerView.getChildAt(i);
                                        v.findViewById(R.id.article_body).startAnimation(fadeOut);
                                    }
                                    mCurrentPage = mCurrentPage + 1;
                                }
                            });
    
                            mEndsInSpace = true;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
    
            mTextSwitcherThread.start();
        }
    
        private void addStoryToLibrary(){
    
        }
    
        private void refresh() {
            startService(new Intent(this, UpdaterService.class));
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            registerReceiver(mRefreshingReceiver, new IntentFilter(UpdaterService.BROADCAST_ACTION_STATE_CHANGE));
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            unregisterReceiver(mRefreshingReceiver);
        }
    
        private boolean mIsRefreshing = false;
    
        private BroadcastReceiver mRefreshingReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (UpdaterService.BROADCAST_ACTION_STATE_CHANGE.equals(intent.getAction())) {
                    mIsRefreshing = intent.getBooleanExtra(UpdaterService.EXTRA_REFRESHING, false);
                    updateRefreshingUI();
                }
            }
        };
    
        private void updateRefreshingUI() {
            mSwipeRefreshLayout.setRefreshing(mIsRefreshing);
        }
    
        @Override
        public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
            return ArticleLoader.newAllArticlesInstance(this);
        }
    
        @Override
        public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
            mAdapter = new Adapter(this,cursor);
            mAdapter.setHasStableIds(true);
            mRecyclerView.setAdapter(mAdapter);
            int columnCount = getResources().getInteger(R.integer.list_column_count);
            StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(columnCount, StaggeredGridLayoutManager.VERTICAL);
            mRecyclerView.setLayoutManager(sglm);
        }
    
        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
            mRecyclerView.setAdapter(null);
        }
    
        private class Adapter extends RecyclerView.Adapter<ViewHolder> {
            private Cursor mCursor;
            private Context mContext;
    
            public Adapter(Context context,Cursor cursor) {
                mContext = context;
                mCursor = cursor;
            }
    
            @Override
            public long getItemId(int position) {
                mCursor.moveToPosition(position);
                return mCursor.getLong(ArticleLoader.Query._ID);
            }
    
            @Override
            public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
                View view = getLayoutInflater().inflate(R.layout.list_item_article, parent, false);
                final ViewHolder vh = new ViewHolder(view);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(final View view) {
                        mTextSwitcherThread.interrupt(); // interrupt text cycle thread as we go to detail views
                        for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                            View v = mRecyclerView.getChildAt(i);
                            if(v != view) {
                                v.findViewById(R.id.article_body).startAnimation(fadeOut);
                                v.setAnimation(mNewspaperClipSlideDownAnimation);
                                v.startAnimation(mNewspaperClipSlideDownAnimation);
                            }
                        }
    
                        mNewspaperClipSlideDownAnimation.setAnimationListener(new Animation.AnimationListener() {
                            @Override
                            public void onAnimationStart(Animation animation) {
    
                            }
    
                            @Override
                            public void onAnimationEnd(Animation animation) {
                                for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
                                    View v = mRecyclerView.getChildAt(i);
                                    if(v != view) {
                                        v.setVisibility(View.INVISIBLE);
                                    }
                                }
                            }
    
                            @Override
                            public void onAnimationRepeat(Animation animation) {
    
                            }
                        });
    
                        ExpandingCardViewAnimation animation = new ExpandingCardViewAnimation(getApplicationContext(),parent,view);
                        animation.configureAnimation();
                        view.setAnimation(mNewspaperClipSelectedAnimation);
                        view.startAnimation(mNewspaperClipSelectedAnimation);
    
                        mNewspaperClipSlideDownAnimation.setAnimationListener(new Animation.AnimationListener() {
                            @Override
                            public void onAnimationStart(Animation animation) {
    
                            }
    
                            @Override
                            public void onAnimationEnd(Animation animation) {
                                view.getViewTreeObserver().addOnPreDrawListener(
                                        new ViewTreeObserver.OnPreDrawListener() {
                                            @Override
                                            public boolean onPreDraw() {
                                                view.getViewTreeObserver().removeOnPreDrawListener(this);
                                                startPostponedEnterTransition(vh);
                                                return true;
                                            }
                                        });
                            }
    
                            @Override
                            public void onAnimationRepeat(Animation animation) {
                            }
                        });
                    }
                });
                return vh;
            }
    
            public void startPostponedEnterTransition(ViewHolder vh){
                String transitionName = getString(R.string.transition_list_item);
                Activity activity = (Activity) mContext;
                ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, mRecyclerView,transitionName);
                ActivityCompat.startActivity(activity, new Intent(Intent.ACTION_VIEW, ItemsContract.Items.buildItemUri(getItemId(vh.getAdapterPosition()))), options.toBundle());
            }
    
            @Override
            public void onBindViewHolder(final ViewHolder holder, int position) {
                mCursor.moveToPosition(position);
                holder.titleView.setText(mCursor.getString(ArticleLoader.Query.TITLE));
                holder.subtitleView.setText(Html.fromHtml(
                        DateUtils.getRelativeTimeSpanString(
                                mCursor.getLong(ArticleLoader.Query.PUBLISHED_DATE),
                                System.currentTimeMillis(), DateUtils.HOUR_IN_MILLIS,
                                DateUtils.FORMAT_ABBREV_ALL).toString()
                                + " by <font color='#ffffff'>"
                                + mCursor.getString(ArticleLoader.Query.AUTHOR)
                                + "</font>"));
                holder.thumbnailView.setImageUrl(
                        mCursor.getString(ArticleLoader.Query.THUMB_URL),
                        ImageLoaderHelper.getInstance(ArticleListActivity.this).getImageLoader());
                holder.thumbnailView.setAspectRatio(mCursor.getFloat(ArticleLoader.Query.ASPECT_RATIO));
    
                mbodyText = mCursor.getString(ArticleLoader.Query.BODY);
                mMaxChars = mbodyText.length();
                mTotalPages = mMaxChars/mWordBuffer;
                holder.bodyView.setText(mbodyText.substring(mTextPostion, mTextPostion + mWordBuffer));
    
                holder.pagesview.removeAllViews();
                for(int i = 0; i < mTotalPages; i++){
                    TextView mPageText = new TextView(getApplicationContext());
                    mPageText.setLayoutParams(new RelativeLayout.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT));
                    mPageText.setText(Integer.toString(i + 1));
                    mPageText.setPadding(mPagePadding,mPagePadding,mPagePadding,0);
                    mPageText.setTextSize(19);
    
                    if(mCurrentPage == i)
                        mPageText.setTextColor(getResources().getColor(R.color.highlited_page_color));
                    else
                        mPageText.setTextColor(getResources().getColor(R.color.blue_page_number_color));
    
                    mPageText.setTag(i);
                    mPageText.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            for (int i = 0; i < mTotalPages; i++) {
                                TextView pageView = (TextView) holder.pagesview.getChildAt(i);
                                pageView.setTextColor(getResources().getColor(R.color.blue_page_number_color));
                            }
                            ((TextView)v).setTextColor(getResources().getColor(R.color.highlited_page_color));
                            mTextPostion = (int) v.getTag() * mWordBuffer;
                            mCurrentPage = (int) v.getTag();
                            v.startAnimation(fadeOut);
                        }
                    });
                    holder.pagesview.addView(mPageText);
                }
    
                holder.libraryfabbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        addStoryToLibrary();
                        Snackbar addToLibrarySnackbar = Snackbar.make(mMainContainer,getString(R.string.story_added_to_library),Snackbar.LENGTH_LONG);
                        addToLibrarySnackbar.show();
                    }
                });
    
                holder.facebooklikebutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        addStoryToLibrary();
                        Snackbar addToLibrarySnackbar = Snackbar.make(mMainContainer,getString(R.string.story_added_to_library),Snackbar.LENGTH_LONG);
                        addToLibrarySnackbar.show();
                    }
                });
            }
    
            @Override
            public int getItemCount() {
                return mCursor.getCount();
            }
        }
    
        public static class ViewHolder extends RecyclerView.ViewHolder {
            public DynamicHeightNetworkImageView thumbnailView;
            public TextView titleView;
            public TextView subtitleView;
            public TextView bodyView;
            public LinearLayout pagesview;
            public ImageButton libraryfabbutton;
            public ImageButton facebooklikebutton;
    
            public ViewHolder(final View view) {
                super(view);
                thumbnailView = (DynamicHeightNetworkImageView) view.findViewById(R.id.thumbnail);
                titleView = (TextView) view.findViewById(R.id.article_title);
                subtitleView = (TextView) view.findViewById(R.id.article_subtitle);
                bodyView = (TextView) view.findViewById(R.id.article_body);
                pagesview = (LinearLayout) view.findViewById(R.id.newspaper_clip_pages);
                libraryfabbutton = (ImageButton) view.findViewById(R.id.add_to_lib_fab);
                facebooklikebutton = (ImageButton) view.findViewById(R.id.face_book_like_button);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2012-10-09
      • 1970-01-01
      相关资源
      最近更新 更多