快速滚动时,RecyclerAdapter行会进行洗牌

时间:2017-01-29 19:15:24

标签: java android android-recyclerview recycler-adapter

你好:)我已经看过很多关于这个主题的帖子,但我还没有解决我的问题。

在我的应用程序(Android)中,我有一个RecyclerView,我自己的适配器和我自己的ViewHolder。

当我快速滚动时,每行的数据都在洗牌。 (每行包含" x"按钮。按钮数量也会改变。按钮的标签也会改变。)

我的适配器,看起来像这样

public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerHolders> {
    private List<Post> posts;
    protected Context context;
    private String userId;
    public PostRecyclerAdapter(Context context, List<Post> posts,String userId) {
        this.posts = posts;
        this.context = context;
        this.userId = userId;
        setHasStableIds(true);
    }
    @Override
    public PostRecyclerHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        PostRecyclerHolders viewHolder = null;
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_post_row, parent, false);
        viewHolder = new PostRecyclerHolders(layoutView, posts, context);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(PostsRecyclerHolders holder, int position) {
        Post post = posts.get(position);
        List<But> buts = post.getButs(); //list of But (Contains label and date) max size = 6
        holder.label.setText(post.getLabel());
        //initialize all button
        for(i=0; i<buts.size();i++){
            holder.listButs.get(i).setText(buts.get(i).getLabel());
        }
        //hide other buts
        for(int j = i ;j < 6 ; j++){
            holder.listsButs.get(j).setVisibility(View.GONE);
        }
        holder.userId = userId;
    }
    @Override
    public int getItemCount() {
        return this.posts.size();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

我的ViewHolder

public class PostRecyclerHolders extends RecyclerView.ViewHolder{
    public TextView libelle;
    public LinearLayout butLayout;
    public ArrayList<Button> listButs;
    public String userId;
    public Context context;
    private List<Post> postsObj;

    public PostRecyclerHolders(final View itemView, final List<Post> postsObj, Context context) {
        super(itemView);
        this.context=context;
        this.postsObj = postsObj;
        //list button init
        listButs = new ArrayList<Button>();
        //initialisation des
        libelle = (TextView)itemView.findViewById(R.id.libelle);
        butLayout= (LinearLayout)itemView.findViewById(R.id.but_list);
        for(int i=0; i<6;i++){
            final int butN = i;
            Button btn = createButton(context, i);
             btnRep.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                 /* Do something */
                 }
             });

            listBut.add(btn);
            reponsesLayout.addView(btn);
        }
    }

    //Crate a button
    public Button createButton(Context c, int id){
        Button b = new Button(c);
        b.setText("");
        b.setId(getIdButton(id));
        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        lp.setMargins(0,50,0,0);
        b.setVisibility(View.VISIBLE);
        b.setLayoutParams(lp);
        b.setBackgroundResource(R.drawable.button_blue);
        b.setClickable(true);
        b.setTextSize(18);
        return b;
    }
}

我已将setHasStableIds设置为true并实现了getItemId,但没有任何变化。数据总是随机播放。 有人看到问题出在哪里了?

感谢您的帮助。 (抱歉我的英文)。

0 个答案:

没有答案