标签: android-viewholder

RecyclerView的行正在改组并更改Images:android

  • 其他问题的问题变更是固定的.

我的问题是当Recycler View向上和向下滚动时

  • 当快速滚动并返回到原始位置时,行项目会改变它的位置.
  • 行项目使其部分修复为背景

我在这里如何在Fragment中设置My Recycler视图.

private void setRecyclerView() {
    recyclerView.setHasFixedSize(true);
    StaggeredGridLayoutManager layoutManager =
            new StaggeredGridLayoutManager(2, 1);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new TwitterTweetAdapter(getActivity());

    // setting every thing false in item animator 
    recyclerView.setItemAnimator(new RecyclerView.ItemAnimator() {

        @Override
        public void runPendingAnimations() {

        }

        @Override
        public boolean animateRemove(RecyclerView.ViewHolder viewHolder) {
            return false;
        }

        @Override
        public boolean animateAdd(RecyclerView.ViewHolder viewHolder) {
            return false;
        }

        @Override
        public boolean animateMove(RecyclerView.ViewHolder viewHolder, int i, int i2, int i3, int i4) {
            return false;
        }

        @Override
        public boolean animateChange(RecyclerView.ViewHolder viewHolder, …
Run Code Online (Sandbox Code Playgroud)

android adapter fragment android-viewholder android-recyclerview

9
推荐指数
1
解决办法
6104
查看次数

在RecycleView适配器中实现多个ViewHolder类型

这可能是一个讨论而不是一个问题.

正常的方式来实现多种类型

如您所知,如果我们想要实现多种类型RecyclerView,我们应该提供多种CustomViewHolder扩展RecyclerView.ViewHolder.

对于exmpale,

class TextViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
}

class ImageViewHolder extends RecyclerView.ViewHolder{
    ImageView imageView;
}
Run Code Online (Sandbox Code Playgroud)

然后我们必须覆盖getItemViewType.并onCreateViewHolder进入构造TextViewHolderImageViewHolder.

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 0) {
        return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
    } else {
        return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
    }
} 
Run Code Online (Sandbox Code Playgroud)

上面的代码是正常的,但还有另一种方式.

其他方式

我想只有一个CustomViewHolder就足够了.

 class MultipleViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    ImageView imageView;

    MultipleViewHolder(View itemView, int type){
       if(type == …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-view android-viewholder android-recyclerview

9
推荐指数
1
解决办法
6263
查看次数

我应该在哪里将setOnClickListener放在RecyclerView适配器中

在互联网上的教程中,他们在RecyclerView的Adapter中设置了OnClickListener,它们以两种方式定义它:在ViewHolder内部或在BindViewHolder内部.

我的问题是哪一个是更好的方法,请推荐任何其他方法(如果有的话)

1)在ViewHolder中:

public static class ViewHolder extends RecyclerView.ViewHolder {

    public ViewHolder(View itemView) {
        super(itemView);
        tvSrc = (TextView) itemView.findViewById(R.id.tvSrc);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

2)在BindViewHolder里面

public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) {

    viewHolder.tvSrc.setText(mDataset.get(position).strSrc);
    viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show();
        }
    });
}    
Run Code Online (Sandbox Code Playgroud)

android android-viewholder android-recyclerview

8
推荐指数
2
解决办法
5818
查看次数

viewholder是否应该引用适配器?

我正在阅读Google的示例代码,代码如下:

public class AttractionListFragment extends Fragment {
...

private class AttractionAdapter extends RecyclerView.Adapter<ViewHolder>
        implements ItemClickListener {

    public List<Attraction> mAttractionList;
    private Context mContext;

    public AttractionAdapter(Context context, List<Attraction> attractions) {
        super();
        mContext = context;
        mAttractionList = attractions;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.d("TEST", "onCreateViewHolder");
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.list_row, parent, false);
        return new ViewHolder(view, this);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Attraction attraction = mAttractionList.get(position);

        holder.mTitleTextView.setText(attraction.name);
        holder.mDescriptionTextView.setText(attraction.description);
        Glide.with(mContext)
                .load(attraction.imageUrl)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .placeholder(R.drawable.empty_photo)
                .override(mImageSize, …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewholder

8
推荐指数
1
解决办法
1113
查看次数

导致此异常的原因java.lang.RuntimeException:java.lang.NoSuchMethodException:<init> [class android.view.View]

我的firebase项目有问题.我按照firebaseGitHub文档中的步骤进行操作,但是我得到了这个例外

java.lang.RuntimeException: java.lang.NoSuchMethodException: <init>
[class android.view.View]
Run Code Online (Sandbox Code Playgroud)

这是一个ViewHolder不是内部阶级的类.

public class ProductViewHolder extends RecyclerView.ViewHolder{
public View mView;
public ImageView img;
public TextView title;
public TextView price;
public RatingBar stars;


ProductViewHolder(View itemView) {
    super(itemView);

    mView = itemView;
    img = (ImageView) itemView.findViewById(R.id.productImg);
    title = (TextView) itemView.findViewById(R.id.txtTitle);
    price = (TextView) itemView.findViewById(R.id.txtPrice);
    stars = (RatingBar) itemView.findViewById(R.id.ratingBar);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是与firebase相关的代码

@Override
protected void onStart() {
    super.onStart();

    // Recycler adapter
    FirebaseRecyclerAdapter<Product, ProductViewHolder> adapter =
            new FirebaseRecyclerAdapter<Product, ProductViewHolder>(
                    Product.class,
                    R.layout.product_list_item,
                    ProductViewHolder.class,
                    firebaseRef.child("product")) { …
Run Code Online (Sandbox Code Playgroud)

android firebase android-viewholder android-recyclerview

8
推荐指数
1
解决办法
2436
查看次数

如何使带有 Composable ViewHolder 的 RecyclerView 渲染速度更快?

根据https://developer.android.com/jetpack/compose/interop/compose-in-existing-ui#compose-recyclerview,可在 RecyclerView 中使用的可组合 ViewHolder 如下

import androidx.compose.ui.platform.ViewCompositionStrategy

class MyComposeViewHolder(
    val composeView: ComposeView
) : RecyclerView.ViewHolder(composeView) {

    init {
        composeView.setViewCompositionStrategy(
            ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
        )
    }

    fun bind(input: String) {
        composeView.setContent {
            MdcTheme {
                Text(input)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来,每次都是bind可组合的setContent(即再次重绘)。

我使用Profile GPU Rendering测量速度,它清楚地表明 ReyclerView+ComposeViewHolder 的混合比纯 RecyclerView 或 LazyColumn 慢。

在此输入图像描述

您可以在这里获取设计

我们怎样才能加快混合 RecyclerView+ComposeViewHolder 的速度?

android android-viewholder android-recyclerview android-jetpack-compose

8
推荐指数
1
解决办法
3189
查看次数

使用ViewHolder的Android列表视图

我有个问题.点击后我试图在列表视图中更改图标.它可以正常工作,虽然不会仅修改点击的图标,但也不会修改那些未显示的图标.例如,如果我单击列表视图的第一项中的图标,则第五个图标也会更改.对于以下所有项目(列表视图的每五个项目)重复此行为.这是我的getView方法:

   public class AlphabeticalAdapter extends ArrayAdapter<String>
   {
       int layoutResourceId; 
       private final Context context;
       private List<String> data;
       private ProgressDialog mProgressDialog;
       private ImageView downloadImageButton;


       public AlphabeticalAdapter(Context context, int resource, List<String> data){
           super(context, resource, data);
           this.layoutResourceId = resource;
           this.context = context;
           this.data = data;    
       }

       public View getView(int position, View convertView, ViewGroup parent) {

          // View rowView = convertView;
           final ViewHolder viewHolder;

           if (convertView == null) {

               LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


               convertView  = inflater.inflate(R.layout.catalogslist_single_row, parent, false);

           viewHolder = new ViewHolder();

           viewHolder.catlogTitle=(TextView)convertView.findViewById(R.id.txtTitle); …
Run Code Online (Sandbox Code Playgroud)

android android-arrayadapter android-listview android-viewholder

7
推荐指数
2
解决办法
3万
查看次数

使用Android中的Firebase在单个RecyclerView中获取两个不同的视图

我开发了一个应用程序,其中有两个帖子

  • 使用毕加索的图像文章
  • 使用Youtube Api的视频帖子.

我以实现双方RecyclerView火力地堡recyclerAdapter但问题是,我不知道如何区分这两种观点,如果我用用视频查看YouTube API取得它被附加与图像视图,也得到复制到所有recyclerView项目,然后所有项目中只播放一个视频.我想要的是,如果我想要显示图像,那么该项目只能获取图像,如果我想显示视频,那么reyclerView项目只能获得视频而不重复.喜欢Instagram.我搜索了很多论坛,但没有得到任何帮助.请帮忙.我使用Firebase作为我的数据库,ViewHolders就是根据这个.

图片和视频帖子的类文件:

FirebaseRecyclerAdapter <post, postViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<post, postViewHolder>(
    post.class,
    R.layout.post_row_recycle_home,
    postViewHolder.class,
    mDatabaseReference
) {
    @Override
    protected void populateViewHolder(postViewHolder viewHolder, post model, int position) {
        viewHolder.setimage(getApplicationContext(), model.getImage());
        viewHolder.setYoutube(model.getYoutube()); 
    }
};

mrecyclerView.setAdapter(firebaseRecyclerAdapter);
Run Code Online (Sandbox Code Playgroud)

持有人:

public static class postViewHolder extends RecyclerViewPager.ViewHolder{

    View mView;

    public postViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    public void setYoutube(final String youtube){
        final YouTubePlayerView youPlay = (YouTubePlayerView) mView.findViewById(R.id.youtuber);
        youPlay.initialize("SOME KEY",
            new YouTubePlayer.OnInitializedListener() …
Run Code Online (Sandbox Code Playgroud)

youtube android firebase android-viewholder android-recyclerview

7
推荐指数
2
解决办法
1059
查看次数

如何在onBindViewHolder()中的notifyItemChange()之后为recyclerView元素中的子视图设置动画

我想给a textView内部的动画,recyclerView以便在调用时向上过渡notifyItemChanged(position)。这是我的onBindViewholder(),当适配器发生更改时,它会自动被调用:

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    if (unfoldedIndexes.contains(position)) { // if already unfolded
        bindUnfoldedState(holder, holder.getLayoutPosition());
    }else{ // show the folded state}
}

public void bindUnfoldedState(ViewHolder holder, int position){


    if(lc.isBtnEnabled()){
            holder.Price.setText("text");
            holder.Price.animate().alpha(1.0f).setDuration(500);
            holder.Price.animate().translationY(-38).setDuration(500);
            holder.checkText.animate().translationY(38).setDuration(500);
        }else {
            holder.Price.animate().alpha(0.0f).setDuration(500);
            holder.Price.animate().translationY(0).setDuration(500);
            holder.checkText.animate().translationY(0).setDuration(500);
        }

}
Run Code Online (Sandbox Code Playgroud)

notifyItemChanged()被这样称呼fragment onClick

 ok.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
            // some changes to the data
            adapter.getLcns().get(Position).setBtnEnabled(true);
            adapter.notifyItemChanged(Position);
            }
}
Run Code Online (Sandbox Code Playgroud)

isBtnEnabled()如果etBtnEnabled(true)调用s …

animation android android-viewholder android-recyclerview

7
推荐指数
1
解决办法
161
查看次数

如何使用下一页“10 项”填充标题和网格布局

在我的应用程序中,我有四种布局,“卡片列表”“卡片杂志”“标题”“网格”,我制作了选项菜单以允许用户从“更改布局”选项菜单中更改它,问题发生了这是第一次运行应用程序时选择标题或网格布局,它显示唯一的第一页“10 项”结果来自改造调用

在此处输入图片说明

要相关,请参阅此问题

在这个应用程序的旧版本“当我使用活动时”我用标题和网格视图持有者的这行代码解决了这个问题

if(position == getItemCount() -1)

if(context instanceof MainActivity){
 ((MainActivity)context).getMainPagePosts();

}
Run Code Online (Sandbox Code Playgroud)

但是在这个版本中我使用了片段,所以当我试图解决它时,我创建了一个名为“WhichFragmentCalled”的接口,并将片段和 viewHolder 作为参数

public interface WhichFragmentCalled {

     void whichFragmentAndViewModel(Fragment fragment, PostViewModel postViewModel);
}

Run Code Online (Sandbox Code Playgroud)

然后我在适配器和片段中使用它,就像这样

 @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        WhichFragmentCalled whichFragmentCalled = adapter;

        whichFragmentCalled.whichFragmentAndViewModel(this,postViewModel);
    }
Run Code Online (Sandbox Code Playgroud)

并使适配器实现此接口,这是完整的PostAdapter代码

public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements WhichFragmentCalled{
    private Context context;
    private List<Item> items;

    private static final int CARD = 0;
    private …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments android-viewholder android-recyclerview

7
推荐指数
0
解决办法
149
查看次数