Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动时如何重置RecyclerView Viewholder布局_Android_Imageview_Android Recyclerview - Fatal编程技术网

Android 滚动时如何重置RecyclerView Viewholder布局

Android 滚动时如何重置RecyclerView Viewholder布局,android,imageview,android-recyclerview,Android,Imageview,Android Recyclerview,我在我的RecyclerView适配器中使用了Viewholder,我在其中动态创建ImageView。但是,当我向下滚动并向上滚动时,新图像会显示在先前图像的顶部。我知道这是回收的概念,但如何重置/清除视图保持架/布局,使旧的图像视图不会出现在每个回收视图上 public class RallyAdapter extends RecyclerView.Adapter<RallyAdapter.ViewHolder> { public static class ViewHolder

我在我的
RecyclerView
适配器中使用了
Viewholder
,我在其中动态创建ImageView。但是,当我向下滚动并向上滚动时,新图像会显示在先前图像的顶部。我知道这是回收的概念,但如何重置/清除
视图保持架
/布局,使旧的
图像视图
不会出现在每个回收视图上

public class RallyAdapter extends RecyclerView.Adapter<RallyAdapter.ViewHolder> {

public static class ViewHolder extends RecyclerView.ViewHolder{
    public TextView nameTextView;
    public TextView dateTextView;
    public TextView creatorTextView;
    public ImageButton thumbnail;
    public RelativeLayout relativeLayout;

    public ViewHolder(View itemView) {

        super(itemView);

        relativeLayout = (RelativeLayout) itemView.findViewById(R.id.view);
        nameTextView = (TextView) itemView.findViewById(R.id.name);
        dateTextView = (TextView) itemView.findViewById(R.id.date);
        thumbnail = (ImageButton) itemView.findViewById(R.id.imageButton);
        creatorTextView = (TextView) itemView.findViewById(R.id.creator_name);
    }
}

private ArrayList<Rally> mRallys;
private Context mContext;

public RallyAdapter(Context context, ArrayList<Rally> rallys) {
    this.mRallys = rallys;
    this.mContext = context;
}

// Usually involves inflating a layout from XML and returning the holder
@Override
public RallyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    // Inflate the custom layout
    View rallyView = inflater.inflate(R.layout.rally, parent, false);

    // Return a new holder instance
    ViewHolder viewHolder = new ViewHolder(rallyView);


    return viewHolder;
}

// Involves populating data into the item through holder
@Override
public void onBindViewHolder(RallyAdapter.ViewHolder viewHolder, final int position) {

    // Get the data model based on position
    final Rally rally = mRallys.get(position);

    // Set item views based on the data model
    TextView nameTV = viewHolder.nameTextView;

    nameTV.setText(rally.getName());

    TextView dateTV = viewHolder.dateTextView;

    dateTV.setText(rally.getStartDate());

    ImageButton imageButton = viewHolder.thumbnail;

    TextView creatorTV = viewHolder.creatorTextView;

    creatorTV.setText(rally.getCreator_name());

    Picasso.with(mContext).load(rally.getThumbnail()).fit().centerCrop().into(imageButton);

    List<String> image_urls = rally.getTransportationImgs();
    List<String> methods = rally.getTransportationStrs();
    ArrayList<ImageView> IMGS = new ArrayList<ImageView>();

    for (int i = 0; i < methods.size(); i++) {

        String method = methods.get(i);

        for (int j = 0; j < image_urls.size(); j++) {

            String img_url = image_urls.get(j);

            if (img_url.toLowerCase().contains(method.toLowerCase()) == true) {

                ImageView image = new ImageView(mContext);
                dateTV = viewHolder.dateTextView;
                imageButton = viewHolder.thumbnail;

                image.setId(generateViewId());

                IMGS.add(image);

                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

                if (IMGS.size() > 1) {

                    params.addRule(RelativeLayout.RIGHT_OF, IMGS.get(IMGS.size() - 1).getId());
                    params.addRule(RelativeLayout.ALIGN_TOP, IMGS.get(IMGS.size() - 1).getId());
                    params.addRule(RelativeLayout.END_OF, IMGS.get(IMGS.size() - 1).getId());
                } else {

                    params.addRule(RelativeLayout.RIGHT_OF, imageButton.getId());
                    params.addRule(RelativeLayout.BELOW, dateTV.getId());
                    params.addRule(RelativeLayout.END_OF, imageButton.getId());
                }

                params.height = 65;
                params.width = 65;

                image.setLayoutParams(params);

                viewHolder.relativeLayout.addView(image);

                //viewHolder.relativeLayout.addView(rallyLayout);

                Picasso.with(mContext).load(img_url).fit().centerCrop().into(image);
            }
        }
    }
}
公共类RallyAdapter扩展了RecyclerView.Adapter{
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图名称文本视图;
公共文本视图日期文本视图;
公共文本视图creatorTextView;
公共图像按钮缩略图;
公共关系;
公共视图持有者(视图项视图){
超级(项目视图);
relativeLayout=(relativeLayout)itemView.findViewById(R.id.view);
nameTextView=(TextView)itemView.findViewById(R.id.name);
dateTextView=(TextView)itemView.findViewById(R.id.date);
缩略图=(ImageButton)itemView.findViewById(R.id.ImageButton);
creatorTextView=(TextView)itemView.findViewById(R.id.creator\u name);
}
}
私人ArrayList mRallys;
私有上下文;
公共RallyAdapter(上下文、ArrayList Ralls){
this.mRallys=拉力;
this.mContext=上下文;
}
//通常涉及从XML中膨胀布局并返回持有者
@凌驾
public RallyAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
Context=parent.getContext();
LayoutFlater充气机=LayoutFlater.from(上下文);
//对自定义布局进行充气
查看拉力视图=充气机。充气(R.layout.rally,父项,false);
//返回一个新的holder实例
ViewHolder ViewHolder=新的ViewHolder(rallyView);
返回视图持有者;
}
//涉及通过holder将数据填充到项目中
@凌驾
BindViewHolder上的公共无效(RallyAdapter.ViewHolder ViewHolder,最终int位置){
//根据位置获取数据模型
最终拉力=mRallys.get(位置);
//基于数据模型设置项目视图
TextView nameTV=viewHolder.nameTextView;
nameTV.setText(rally.getName());
TextView dateTV=viewHolder.dateTextView;
dateTV.setText(rally.getStartDate());
ImageButton ImageButton=viewHolder.缩略图;
TextView creatorTV=viewHolder.creatorTextView;
creatorTV.setText(rally.getCreator_name());
毕加索.with(mContext).load(rally.getThumbnail()).fit().centerCrop().into(图像按钮);
List image_url=rally.getTransportationImgs();
List methods=rally.getTransportationStrs();
ArrayList IMGS=新的ArrayList();
对于(int i=0;i1){
params.addRule(RelativeLayout.RIGHT_OF,IMGS.get(IMGS.size()-1.getId());
params.addRule(RelativeLayout.ALIGN_TOP,IMGS.get(IMGS.size()-1.getId());
params.addRule(RelativeLayout.END_OF,IMGS.get(IMGS.size()-1.getId());
}否则{
params.addRule(RelativeLayout.RIGHT_OF,imageButton.getId());
params.addRule(RelativeLayout.down,dateTV.getId());
params.addRule(RelativeLayout.END_OF,imageButton.getId());
}
参数高度=65;
参数宽度=65;
image.setLayoutParams(参数);
viewHolder.relativeLayout.addView(图像);
//viewHolder.relativeLayout.addView(rallyLayout);
毕加索.with(mContext).load(img_url).fit().centerCrop().into(图像);
}
}
}
}
下面是加载时视图的外观

在滚动一段时间后


我认为您需要有一个
线性布局
在for循环之前按住图标并清除它:

viewHolder.linearLayout.removeAllViews();

我认为您需要有一个
线性布局
按住图标并在for循环之前将其清除:

viewHolder.linearLayout.removeAllViews();

因为我刚刚遇到了一个类似的问题,如果在onBindViewHolder()中设置了大量样式,那么重写onViewRecycled()以及将视图恢复到其原始状态可能会有帮助…

因为我刚刚遇到了一个类似的问题,如果在onBindViewHolder()中设置了大量样式,重写onViewRecycled()可能会有帮助以及将视图恢复到其原始状态…

作为测试,我尝试了
viewHolder.relativeLayout.removeAllViews()
虽然我的屏幕上除了图像外什么都没有出现,但这确实解决了我的问题,因为我可以在不创建图像的情况下来回滚动。只是为了澄清一下……你建议我创建一个
线性布局
,作为我的
RelativeLayout
的孩子,对吗?是的,是
我的权利mageButton
和下面的
dateTV
。这也意味着您不必弄乱布局参数。为什么要在onbind中创建imageview列表?当一个视图持有者有多个imageview时,是否可以发布最终结果的图像?这是将视图重置为其原始和xml状态的正确方法。人们需要了解d此更新与
notifydatasetchange
是分开的。作为测试,我尝试了
viewHolder.relativeLay