RecyclerView再生ViewHolder图像视图大小错误 [英] RecyclerView Recycled ViewHolder Image View wrong size

查看:1819
本文介绍了RecyclerView再生ViewHolder图像视图大小错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有不同的视图持有人回收视图。

一对夫妇的观点持有者有图像视图,我传递到滑翔来显示图像。

问题是,当回收视图开始回收的意见,ImageView的宽度/高度是回收的观点,他们然后错误地显示图像。

下面是我的ImageView的:

 < ImageView的
    机器人:ID =@ + ID /图像
    机器人:layout_marginTop =@扪/ feed_item_margin
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_gravity =中心/>

这是传递到滑翔

  Glide.with(itemView.getContext())
    .load(Uri.parse(MediaUtils
    .getMedia(feedContent).getMediaUrl()))
    .placeholder(R.drawable.placeholder)
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .crossFade()成(图像)。

这工作得很好,直到Recyclerview开始回收所以在recyclerview第一个图像看起来像这样这是它是如何打算的样子。

在这里输入的形象描述

然而,当您滚动距离项目路程,前后滚动,它看起来是这样的:

在这里输入的形象描述

因此​​,图像已被扭曲和不不是父的全宽

我想要的图像视图来包装内容,因为所有的图像将是不同的高度等。
为了测试这个我加了这一行 holder.setIsRecyclable(假); 这个特殊的持有者prevent回收但是作为应显示的所有图像如预期这给了震动效应。

于是,我又试图重新在像这样的 OnViewRecycled 方法图像视图的PARAMS:

  @覆盖
公共无效onViewRecycled(AbstractHolder viewHolder){
    super.onViewRecycled(viewHolder);    INT位置= viewHolder.getAdapterPosition();
    IFeedContent内容= mFeedContentList.get(位置);
    LinearLayout.LayoutParams PARAMS =新LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
    params.setMargins(0,(int)的Utils.dpTopx(mContext,10),0,0);
    params.gravity = Gravity.CENTER;    如果(isImage(内容)){
        。viewHolder.getImageView()setImageURI(NULL);
        viewHolder.getImageView()setImageDrawable(空)。
        viewHolder.getImageView()setImageResource(0)。
        viewHolder.getImageView()setLayoutParams(PARAMS)。
    }
}

在此我重新在XML中PARAMS,但它不工作。该方法 isImage()这只是检查对象的MIME类型。

任何人都可以在这方面的帮助?这是非常令人沮丧的。

任何帮助是AP preciated。

修改适配器添加

 公共类ContentFeedAdapter扩展RecyclerView.Adapter< AbstractHolder> {    私人列表< IFeedContent> mFeedContentList;
    私人语境mContext;
    私人活动mMainActivity;
    私人UserHomeFragment mUserHomeFragment;
    私人UserStreamFragment mUserStreamFragment;
    私人AbstractHolder mAbstractHolder;
    私人最终地图< YouTubeThumbnailView,YouTubeThumbnailLoader> mThumbnailViewToLoaderMap;
    私人的ArrayList< MyMediaPlayer> mMediaPlayerList =新的ArrayList<>();    公共ContentFeedAdapter(上下文CTX,列表与LT; IFeedContent> contentList,活动mainActivity,UserHomeFragment userHomeFragment,UserStreamFragment userStreamFragment){
        this.mContext = CTX;
        this.mFeedContentList = contentList;
        this.mMainActivity = mainActivity;
        this.mThumbnailViewToLoaderMap =新的HashMap< YouTubeThumbnailView,YouTubeThumbnailLoader>();
        this.mUserHomeFragment = userHomeFragment;
        this.mUserStreamFragment = userStreamFragment;
    }    @覆盖
    公共AbstractHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
        mAbstractHolder = createAbstractHolder(viewType,父母);
        返回mAbstractHolder;
    }    @覆盖
    公共无效onBindViewHolder(最终AbstractHolder持有人,最终诠释位置){
        最终IFeedContent内容= mFeedContentList.get(位置);
        holder.bindData(内容);        如果((content.getMedia()= NULL)及!&安培;!content.getMedia()的isEmpty()){
            串mime类型= MediaUtils.getMedia(内容).getMimeType();
            如果(mimeType.contains(mContext.getString(R.string.video))|| mimeType.contains(mContext.getString(R.string.audio))及&放大器;!mimeType.contains(mContext.getString(R.string .youtube))){
                最终进度进度= holder.getProgress();
                最终的ImageView为playButton = holder.getPlayImage();
                最终按钮retryButton = holder.getRetryImage();
                最终的RelativeLayout playerOverLay = holder.getPlayerOverlay();
                最终的ImageView mediaThumb = holder.getMediaThumbnail();                最后MyMediaPlayer球员=新MyMediaPlayer(mContext,holder.getTextureView(),holder.getMediaControllerAnchor(),holder.getProgress()
                                                                    mime类型,MyConstants.SEEK_TO_DEFAULT,retryButton,为playButton,playerOverLay,mediaThumb);
                player.setRecyclerViewPosition(位置);
                mMediaPlayerList.add(播放器);                playButton.setOnClickListener(新View.OnClickListener(){
                    @覆盖
                    公共无效的onClick(视图v){
                        player.startVideo(MediaUtils.getMedia(内容).getMediaUrl());
                        。holder.getPlayImage()setVisibility(View.GONE);
                        progressBar.setVisibility(View.VISIBLE);
                    }
                });
            }
        }
    }    / **
     *松开用于所有持有人
     *缩略图
     * /
    公共无效releaseYouTubeHolders(){
        mAbstractHolder.releaseHolders();
    }    @覆盖
    公众诠释getItemViewType(INT位置){
        INT viewType = -1;
        //实例ViewHolder utils的
        //
        viewType = ViewHolderUtils.selectViewHolder(mFeedContentList.get(位置));        返回viewType;
    }    @覆盖
    公众诠释getItemCount(){
        返回mFeedContentList.size();
    }    @覆盖
    公共无效onViewRecycled(AbstractHolder viewHolder){
        super.onViewRecycled(viewHolder);        INT位置= viewHolder.getAdapterPosition();
        IFeedContent内容= mFeedContentList.get(位置);
        LinearLayout.LayoutParams PARAMS =新LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        params.setMargins(0,(int)的Utils.dpTopx(mContext,10),0,0);
        params.gravity = Gravity.CENTER;        如果(isImage(内容)){
            。viewHolder.getImageView()setImageURI(NULL);
            viewHolder.getImageView()setImageDrawable(空)。
            viewHolder.getImageView()setImageResource(0)。
            viewHolder.getImageView()setLayoutParams(PARAMS)。
        }
    }
    / **
     *创建实例
     *兼容viewholder
     *
     * @参数viewType
     * @参数父
     * @返回
     * /
    私人AbstractHolder createAbstractHolder(INT viewType,父母的ViewGroup){
        AbstractHolder支架=无效;        开关(viewType){
            案例MyConstants.HOLDER_TYPE_1:
                持有人= ViewHolder_Var1.create(父母,mUserHomeFragment,mUserStreamFragment);
                打破;            案例MyConstants.HOLDER_TYPE_2:
                持有人= ViewHolder_Var2.create(父母,mUserHomeFragment,mUserStreamFragment);                打破;            案例MyConstants.HOLDER_TYPE_3:
                持有人= ViewHolder_Var3.create(父母,mUserHomeFragment,mUserStreamFragment);
                L.i(的getClass()getSimpleName(),HOLDER 3。);
                //holder.setIsRecyclable(false);
                打破;            案例MyConstants.HOLDER_TYPE_4:
                持有人= ViewHolder_Var4.create(父母,mUserHomeFragment,mUserStreamFragment);
                L.i(的getClass()getSimpleName(),HOLDER 4);
                打破;            案例MyConstants.HOLDER_TYPE_5:
                持有人= ViewHolder_Var5.create(父母,mUserHomeFragment,mUserStreamFragment);
                L.i(的getClass()getSimpleName(),HOLDER 5);
                打破;            案例MyConstants.HOLDER_TYPE_6:
                持有人= ViewHolder_Var6.create(父母,mUserHomeFragment,mUserStreamFragment);
                L.i(的getClass()getSimpleName(),HOLDER 6);
                打破;            案例MyConstants.HOLDER_TYPE_7:
                持有人= ViewHolder_Var7.create(父母,mUserHomeFragment,mUserStreamFragment);
                L.i(的getClass()getSimpleName(),HOLDER 7。);
                打破;            案例MyConstants.HOLDER_TYPE_8:
                持有人= ViewHolder_Var8.create(父母,mUserHomeFragment,mUserStreamFragment);
                L.i(的getClass()getSimpleName(),HOLDER 8。);
                打破;            案例MyConstants.HOLDER_TYPE_9:
                持有人= ViewHolder_Var9.create(父母,mUserHomeFragment,mUserStreamFragment);
                打破;            案例MyConstants.HOLDER_TYPE_10:
                持有人= ViewHolder_Var10.create(父母,mThumbnailViewToLoaderMap,mUserHomeFragment,mUserStreamFragment);
        }
        回到持有人;
    }    私人布尔isImage(IFeedContent contentItem){
        如果(MediaUtils.getMedia(contentItem)!= NULL){
            串mime类型= MediaUtils.getMedia(contentItem).getMimeType();
            如果(mimeType.contains(图像)){
                L.i(的getClass()getSimpleName()的形象在这里。);
                返回true;
            }其他{
                L.i(的getClass()getSimpleName(),NO形象在这里。);            }
        }
        返回false;
    }}

编辑2 ViewHolder 3

 公共类ViewHolder_Var3扩展AbstractHolder {    @Bind(R.id.text_holder1)TextView的标题;
    @Bind(R.id.text_holder2)TextView的身体;
    @Bind(R.id.image)ImageView的形象;
    @Bind(R.id.tabs_layout)的LinearLayout tabsLayout;
    @Bind(R.id.hot)TextView的热点;
    @Bind(R.id.comments)TextView的儿童;
    @Bind(R.id.gif_label)的TextView的GIF tag;
    @Bind(R.id.user_name)TextView的用户名;
    @Bind(R.id.tag1)的TextView标签1;
    @Bind(R.id.tag2)的TextView标签2;
    @Bind(R.id.tag3)的TextView TAG3;
    @Bind(R.id.profile_pic)SimpleDraweeView profilePic;
    私人布尔mEllipsize;
    私人布尔mExpanded;
    私人UserHomeFragment mUserHomeFragment;
    私人UserStreamFragment mUserStreamFragment;    公共ViewHolder_Var3(查看ItemView控件,UserHomeFragment userHomeFragment,UserStreamFragment userStreamFragment){
        超(ItemView控件);
        ButterKnife.bind(这一点,ItemView控件);
        mUserHomeFragment = userHomeFragment;
        this.mUserStreamFragment = userStreamFragment;    }    @覆盖
    公共无效bindData(最终IFeedContent feedContent){        userName.setText(feedContent.getAuthor()getDisplayName());
        image.setImageResource(0);
        image.setImageDrawable(NULL);
        image.setImageURI(NULL);        TextView的[] tagsArray = {TAG1,TAG2,TAG3};        如果(feedContent.getName()!= NULL){
            heading.setText(feedContent.getName());
        }其他{
            heading.setText(feedContent.getUrl());
        }
        如果(feedContent.getName()!= NULL){
            body.setText((feedContent.getMessage()));
        }其他{
            body.setText(feedContent.getUrl());
        }        Log.i(ViewHolder_Var3.class.getSimpleName(),行数:+将String.valueOf(body.getLineCount()));        如果(!MediaUtils.getMedia(feedContent).getMimeType()。等于(图像/ GIF)){
            gifTag.setVisibility(View.GONE);
            Glide.with(itemView.getContext()).load(Uri.parse(MediaUtils.getMedia(feedContent).getMediaUrl())).placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(image);
        }其他{
            Glide.with(itemView.getContext()).load(Uri.parse(MediaUtils.getMedia(feedContent).getMediaUrl())).asGif().placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.RESULT).crossFade().into(image);
        }        displayProfilePic(feedContent,profilePic);       Glide.with(itemView.getContext()).load(Uri.parse(MediaUtils.getMedia(feedContent).getMediaUrl())).placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.ALL).crossFade().into(image);        如果(mUserHomeFragment == NULL){
            userName.setEnabled(假);
            profilePic.setEnabled(假);
        }其他{
            userName.setEnabled(真);
            profilePic.setEnabled(真);
        }        userName.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                startActivityForResult(mUserHomeFragment,feedContent.getAuthor()的getId(),feedContent.getParentId());
            }
        });        profilePic.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                startActivityForResult(mUserHomeFragment,feedContent.getAuthor()的getId(),feedContent.getParentId());
            }
        });
        长hotAmt = feedContent.getLikeCount() - feedContent.getDislikeCount();
        hot.setText(将String.valueOf(hotAmt));
        children.setText(将String.valueOf(feedContent.getChildCount()));        清单<串GT; tagsList = feedContent.getTags();
        populateTags(tagsList,tagsArray);        //如果(feedContent.getTags()大小()大于0)addTags(代码,tabsLayout);        ViewTreeObserver VTO = body.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(新ViewTreeObserver.OnGlobalLayoutListener(){
            @覆盖
            公共无效onGlobalLayout(){
                ViewTreeObserver观测值= body.getViewTreeObserver();
                obs.removeOnGlobalLayoutListener(本);
                布局布局= body.getLayout();                如果(布局!= NULL){
                    INT线= layout.getLineCount();
                    如果(系大于0){
                        如果(layout.getEllipsisCount(线-1)大于0){
                            mEllipsize = TRUE;
                        }
                    }
                }
            }
        });        body.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                如果(mEllipsize){
                    如果(!mExpanded){
                        ObjectAnimator动画= ObjectAnimator.ofInt(体MAXLINES,20);
                        //animation.setInterpolator(new BounceInterpolator());                        animation.setDuration(200)。开始();
                        // Toast.makeText(itemView.getContext(),我是CLICKED,Toast.LENGTH_LONG).show();
                        mExpanded = TRUE;
                    }其他{
                        ObjectAnimator动画= ObjectAnimator.ofInt(身体,MAXLINES,4);
                        //animation.setInterpolator(new BounceInterpolator());
                        animation.setDuration(200)。开始();
                        // Toast.makeText(itemView.getContext(),我是CLICKED,Toast.LENGTH_LONG).show();
                        mExpanded = FALSE;
                    }
                }
            }
        });
    }
    @覆盖
    公共ImageView的getImageView(){
        返回形象;
    }    公共静态ViewHolder_Var3创建(ViewGroup中父,UserHomeFragment homeFragment,UserStreamFragment userStreamFragment){
        查看根= LayoutInflater.from(parent.getContext())膨胀(R.layout.feed_content_item_layout_var3,父母,假的)。
        返回新ViewHolder_Var3(根,homeFragment,userStreamFragment);
    }
}


解决方案

添加此行

 的android:adjustViewBounds =真

的ImageView 布局文件,它会自动调整图像视图。

在滑行变化 .crossFade() .fitCenter()

I have a recycler view with different View Holders.

A couple of view holders have image views which I pass into Glide to display images.

The problem is, when the recycler view starts recycling views, the imageview width/height are that of the recycled view they then display the image incorrectly.

Here is my ImageView:

<ImageView
    android:id="@+id/image"
    android:layout_marginTop="@dimen/feed_item_margin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>

This is passed into Glide

Glide.with(itemView.getContext())
    .load(Uri.parse(MediaUtils
    .getMedia(feedContent).getMediaUrl()))
    .placeholder(R.drawable.placeholder)
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .crossFade().into(image);

This works well until the Recyclerview starts Recycling so the first image in the recyclerview looks like this which is how it's meant to look.

however, when you scroll away from the item and scroll back it looks like this:

So the image has become distorted and is not not the full width of the parent.

I want the image view to wrap content because all the images will be different heights etc.. To test this I added this line holder.setIsRecyclable(false); to prevent recycling of this particular holder and all the images displayed as the should, however, as expected this gave the jarring effect.

So I then tried resetting the params of the image view in the OnViewRecycled method like so:

@Override
public void onViewRecycled(AbstractHolder viewHolder){
    super.onViewRecycled(viewHolder);

    int position = viewHolder.getAdapterPosition();
    IFeedContent content = mFeedContentList.get(position);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    params.setMargins(0, (int) Utils.dpTopx(mContext,10),0,0);
    params.gravity = Gravity.CENTER;

    if(isImage(content)){
        viewHolder.getImageView().setImageURI(null);
        viewHolder.getImageView().setImageDrawable(null);
        viewHolder.getImageView().setImageResource(0);
        viewHolder.getImageView().setLayoutParams(params);
    }
} 

In this I recreate the params in the xml but it doesn't work. The method isImage() this just checks the mimetype of the object.

Can anyone help on this? It's very frustrating.

Any help on this is appreciated.

EDIT Adapter added

public class ContentFeedAdapter extends RecyclerView.Adapter<AbstractHolder> {

    private List<IFeedContent> mFeedContentList;
    private Context mContext;
    private Activity mMainActivity;
    private UserHomeFragment mUserHomeFragment;
    private UserStreamFragment mUserStreamFragment;
    private AbstractHolder mAbstractHolder;
    private final Map<YouTubeThumbnailView, YouTubeThumbnailLoader> mThumbnailViewToLoaderMap;
    private ArrayList<MyMediaPlayer> mMediaPlayerList = new ArrayList<>();

    public ContentFeedAdapter(Context ctx, List<IFeedContent> contentList,  Activity mainActivity, UserHomeFragment userHomeFragment, UserStreamFragment userStreamFragment){
        this.mContext = ctx;
        this.mFeedContentList = contentList;
        this.mMainActivity = mainActivity;
        this.mThumbnailViewToLoaderMap = new HashMap<YouTubeThumbnailView, YouTubeThumbnailLoader>();
        this.mUserHomeFragment = userHomeFragment;
        this.mUserStreamFragment = userStreamFragment;
    }

    @Override
    public AbstractHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mAbstractHolder = createAbstractHolder(viewType, parent);
        return mAbstractHolder;
    }

    @Override
    public void onBindViewHolder(final AbstractHolder holder, final int position) {
        final IFeedContent content = mFeedContentList.get(position);
        holder.bindData(content);

        if((content.getMedia()!=null) && !content.getMedia().isEmpty()){
            String mimeType = MediaUtils.getMedia(content).getMimeType();
            if(mimeType.contains(mContext.getString(R.string.video)) || mimeType.contains(mContext.getString(R.string.audio)) && !mimeType.contains(mContext.getString(R.string.youtube))){
                final ProgressBar progressBar = holder.getProgress();
                final ImageView playButton = holder.getPlayImage();
                final Button retryButton = holder.getRetryImage();
                final RelativeLayout playerOverLay = holder.getPlayerOverlay();
                final ImageView mediaThumb = holder.getMediaThumbnail();

                final MyMediaPlayer player = new MyMediaPlayer(mContext, holder.getTextureView(), holder.getMediaControllerAnchor(), holder.getProgress(),
                                                                    mimeType, MyConstants.SEEK_TO_DEFAULT, retryButton, playButton, playerOverLay, mediaThumb);
                player.setRecyclerViewPosition(position);
                mMediaPlayerList.add(player);

                playButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        player.startVideo(MediaUtils.getMedia(content).getMediaUrl());
                        holder.getPlayImage().setVisibility(View.GONE);
                        progressBar.setVisibility(View.VISIBLE);
                    }
                });
            }
        }
    }

    /**
     * Release all holders used for the
     * thumbnail views
     */
    public void releaseYouTubeHolders(){
        mAbstractHolder.releaseHolders();
    }

    @Override
    public int getItemViewType(int position){
        int viewType = -1;
        //Instantiate ViewHolder Utils
        //
        viewType = ViewHolderUtils.selectViewHolder(mFeedContentList.get(position));

        return viewType;
    }



    @Override
    public int getItemCount() {
        return mFeedContentList.size();
    }

    @Override
    public void onViewRecycled(AbstractHolder viewHolder){
        super.onViewRecycled(viewHolder);

        int position = viewHolder.getAdapterPosition();
        IFeedContent content = mFeedContentList.get(position);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.setMargins(0, (int) Utils.dpTopx(mContext,10),0,0);
        params.gravity = Gravity.CENTER;

        if(isImage(content)){
            viewHolder.getImageView().setImageURI(null);
            viewHolder.getImageView().setImageDrawable(null);
            viewHolder.getImageView().setImageResource(0);
            viewHolder.getImageView().setLayoutParams(params);
        }
    }


    /**
     * Create instance of
     * compatible viewholder
     *
     * @param viewType
     * @param parent
     * @return
     */
    private AbstractHolder createAbstractHolder(int viewType, ViewGroup parent) {
        AbstractHolder holder = null;

        switch (viewType) {
            case MyConstants.HOLDER_TYPE_1:
                holder = ViewHolder_Var1.create(parent, mUserHomeFragment, mUserStreamFragment);
                break;

            case MyConstants.HOLDER_TYPE_2:
                holder = ViewHolder_Var2.create(parent, mUserHomeFragment, mUserStreamFragment);

                break;

            case MyConstants.HOLDER_TYPE_3:
                holder = ViewHolder_Var3.create(parent, mUserHomeFragment, mUserStreamFragment);
                L.i(getClass().getSimpleName(), "HOLDER 3");
                //holder.setIsRecyclable(false);
                break;

            case MyConstants.HOLDER_TYPE_4:
                holder = ViewHolder_Var4.create(parent, mUserHomeFragment, mUserStreamFragment);
                L.i(getClass().getSimpleName(), "HOLDER 4");
                break;

            case MyConstants.HOLDER_TYPE_5:
                holder = ViewHolder_Var5.create(parent, mUserHomeFragment, mUserStreamFragment);
                L.i(getClass().getSimpleName(), "HOLDER 5");
                break;

            case MyConstants.HOLDER_TYPE_6:
                holder = ViewHolder_Var6.create(parent,  mUserHomeFragment, mUserStreamFragment);
                L.i(getClass().getSimpleName(), "HOLDER 6");
                break;

            case MyConstants.HOLDER_TYPE_7:
                holder = ViewHolder_Var7.create(parent, mUserHomeFragment, mUserStreamFragment);
                L.i(getClass().getSimpleName(), "HOLDER 7");
                break;

            case MyConstants.HOLDER_TYPE_8:
                holder = ViewHolder_Var8.create(parent, mUserHomeFragment, mUserStreamFragment);
                L.i(getClass().getSimpleName(), "HOLDER 8");
                break;

            case MyConstants.HOLDER_TYPE_9:
                holder = ViewHolder_Var9.create(parent, mUserHomeFragment, mUserStreamFragment);
                break;

            case MyConstants.HOLDER_TYPE_10:
                holder = ViewHolder_Var10.create(parent, mThumbnailViewToLoaderMap, mUserHomeFragment, mUserStreamFragment);
        }
        return holder;
    }

    private boolean isImage(IFeedContent contentItem) {
        if (MediaUtils.getMedia(contentItem) != null) {
            String mimeType = MediaUtils.getMedia(contentItem).getMimeType();
            if (mimeType.contains("image")) {
                L.i(getClass().getSimpleName(), "IMAGE HERE");
                return true;
            } else {
                L.i(getClass().getSimpleName(), "NO IMAGE HERE");

            }
        }
        return false;
    }

}

EDIT 2 ViewHolder 3

public class ViewHolder_Var3 extends AbstractHolder {

    @Bind(R.id.text_holder1) TextView heading;
    @Bind(R.id.text_holder2) TextView body;
    @Bind(R.id.image)ImageView image;
    @Bind(R.id.tabs_layout)LinearLayout tabsLayout;
    @Bind(R.id.hot)TextView hot;
    @Bind(R.id.comments)TextView children;
    @Bind(R.id.gif_label)TextView gifTag;
    @Bind(R.id.user_name)TextView userName;
    @Bind(R.id.tag1)TextView tag1;
    @Bind(R.id.tag2)TextView tag2;
    @Bind(R.id.tag3)TextView tag3;
    @Bind(R.id.profile_pic) SimpleDraweeView profilePic;
    private boolean mEllipsize;
    private boolean mExpanded;
    private UserHomeFragment mUserHomeFragment;
    private UserStreamFragment mUserStreamFragment;

    public ViewHolder_Var3(View itemView, UserHomeFragment userHomeFragment, UserStreamFragment userStreamFragment) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        mUserHomeFragment = userHomeFragment;
        this.mUserStreamFragment = userStreamFragment;

    }

    @Override
    public void bindData(final IFeedContent feedContent) {

        userName.setText(feedContent.getAuthor().getDisplayName());
        image.setImageResource(0);
        image.setImageDrawable(null);
        image.setImageURI(null);

        TextView [] tagsArray = {tag1, tag2, tag3};

        if (feedContent.getName() != null) {
            heading.setText(feedContent.getName());
        } else {
            heading.setText(feedContent.getUrl());
        }
        if (feedContent.getName() != null) {
            body.setText((feedContent.getMessage()));
        } else {
            body.setText(feedContent.getUrl());
        }

        Log.i(ViewHolder_Var3.class.getSimpleName(), "Number of lines: " + String.valueOf(body.getLineCount()));

        if(!MediaUtils.getMedia(feedContent).getMimeType().equals("image/gif")){
            gifTag.setVisibility(View.GONE);
            Glide.with(itemView.getContext()).load(Uri.parse(MediaUtils.getMedia(feedContent).getMediaUrl())).placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(image);
        }else {
            Glide.with(itemView.getContext()).load(Uri.parse(MediaUtils.getMedia(feedContent).getMediaUrl())).asGif().placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.RESULT).crossFade().into(image);
        }

        displayProfilePic(feedContent, profilePic);

       Glide.with(itemView.getContext()).load(Uri.parse(MediaUtils.getMedia(feedContent).getMediaUrl())).placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.ALL).crossFade().into(image);

        if(mUserHomeFragment==null){
            userName.setEnabled(false);
            profilePic.setEnabled(false);
        }else{
            userName.setEnabled(true);
            profilePic.setEnabled(true);
        }

        userName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(mUserHomeFragment, feedContent.getAuthor().getId(), feedContent.getParentId());
            }
        });

        profilePic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(mUserHomeFragment, feedContent.getAuthor().getId(), feedContent.getParentId());
            }
        });


        long hotAmt = feedContent.getLikeCount() - feedContent.getDislikeCount();
        hot.setText(String.valueOf(hotAmt));
        children.setText(String.valueOf(feedContent.getChildCount()));

        List<String> tagsList = feedContent.getTags();
        populateTags(tagsList, tagsArray);

        // if (feedContent.getTags().size() > 0) addTags(tags, tabsLayout);

        ViewTreeObserver vto = body.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ViewTreeObserver obs = body.getViewTreeObserver();
                obs.removeOnGlobalLayoutListener(this);
                Layout layout = body.getLayout();

                if(layout!=null){
                    int lines = layout.getLineCount();
                    if(lines>0){
                        if(layout.getEllipsisCount(lines-1)>0){
                            mEllipsize = true;
                        }
                    }
                }
            }
        });

        body.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mEllipsize) {
                    if (!mExpanded) {
                        ObjectAnimator animation = ObjectAnimator.ofInt(body, "maxLines", 20);
                        //animation.setInterpolator(new BounceInterpolator());

                        animation.setDuration(200).start();
                        //     Toast.makeText(itemView.getContext(), "I AM CLICKED", Toast.LENGTH_LONG).show();
                        mExpanded = true;
                    } else {
                        ObjectAnimator animation = ObjectAnimator.ofInt(body, "maxLines", 4);
                        //animation.setInterpolator(new BounceInterpolator());
                        animation.setDuration(200).start();
                        //     Toast.makeText(itemView.getContext(), "I AM CLICKED", Toast.LENGTH_LONG).show();
                        mExpanded = false;
                    }
                }
            }
        });
    }


    @Override
    public ImageView getImageView(){
        return image;
    }

    public static ViewHolder_Var3 create(ViewGroup parent, UserHomeFragment homeFragment, UserStreamFragment userStreamFragment){
        View root = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_content_item_layout_var3, parent, false);
        return new ViewHolder_Var3(root, homeFragment, userStreamFragment);
    }
}

解决方案

Add this line

android:adjustViewBounds="true"

to the imageview in layout file it will automatically resize image view.

in glide change .crossFade() to .fitCenter()

这篇关于RecyclerView再生ViewHolder图像视图大小错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆