Android 滚动时,RecyclerView项目位置更改或删除

Android 滚动时,RecyclerView项目位置更改或删除,android,android-recyclerview,Android,Android Recyclerview,我有一个问题,我一直试图解决太久,但我不知道是什么原因造成的问题 我有一个标记列表,其中包含测试对象和主题字符串,我将它们用作标记之间的部分,我使用getClass()方法确定对象是字符串还是测试,如果是字符串,我隐藏测试的RelativeLayout,如果是测试,我隐藏主题的RelativeLayout。但滚动时,项目会被随机删除和重新添加 我的适配器的类: public class MarksAdapter extends RecyclerView.Adapter<MarksA

我有一个问题,我一直试图解决太久,但我不知道是什么原因造成的问题

我有一个标记列表,其中包含测试对象和主题字符串,我将它们用作标记之间的部分,我使用getClass()方法确定对象是字符串还是测试,如果是字符串,我隐藏测试的RelativeLayout,如果是测试,我隐藏主题的RelativeLayout。但滚动时,项目会被随机删除和重新添加

我的适配器的类:

    public class MarksAdapter extends RecyclerView.Adapter<MarksAdapter.MyHolder>{

public class MyHolder extends RecyclerView.ViewHolder{
    RelativeLayout card;
    TextView title;
    TextView total;
    View divider;
    int posito;

    RelativeLayout group;
    TextView groupTitle;
    TextView groupMark;

    public MyHolder(View itemView) {
        super(itemView);
        this.card = (RelativeLayout)itemView.findViewById(R.id.card);
        this.title = (TextView)itemView.findViewById(R.id.title);
        this.total = (TextView)itemView.findViewById(R.id.mark);
        this.divider = itemView.findViewById(R.id.item_divider);

        this.group = (RelativeLayout)itemView.findViewById(R.id.group);
        this.groupTitle = (TextView)itemView.findViewById(R.id.group_title);
        this.groupMark = (TextView)itemView.findViewById(R.id.group_mark);

    }
}


final ArrayList marks;
Context ctx;
String selectedSem;
TestDatabase db;

public MarksAdapter(Context c, ArrayList marks,String sem,TestDatabase db,ArrayList<Integer> sections){
    this.marks = marks;
    ctx = c;
    selectedSem = sem;
    this.db = db;
}

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        return new MyHolder(LayoutInflater.from(ctx).inflate(R.layout.mark_child, parent, false));
}

int lastPosition = -1;
int offset = 0;

@Override
public void onBindViewHolder(final MyHolder holder, final int positioner) {
    holder.posito = positioner;
        if(marks.get(holder.posito).getClass() == Test.class) {
            holder.group.setVisibility(View.GONE);
            //mark
            final Test test = (Test)marks.get(positioner);
            holder.title.setText(test.getName());
            holder.total.setText(String.format(ctx.getString(R.string.new_m_sum), test.getMarkGot(), test.getMarkOver()));

            //add here
            holder.card.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     Intent i = new Intent(ctx,addTest.class);
                     Test mark = (Test)marks.get(holder.posito);
                     i.putExtra("t_name",mark.getName());
                     i.putExtra("subject",mark.getSubject());
                     i.putExtra("mark_got",mark.getMarkGot());
                     i.putExtra("mark_over",mark.getMarkOver());
                     i.putExtra("mode","edit");
                     i.putExtra("oldId", mark.getId());
                     ctx.startActivity(i);
                }
            });

            holder.card.setLongClickable(true);
            holder.card.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(final View v) {
                    final Dialog dialo = new Dialog(ctx);
                    dialo.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    dialo.setContentView(R.layout.material_dialog);
                    TextView title = (TextView) dialo.findViewById(R.id.title);

                    TextView body = (TextView) dialo.findViewById(R.id.body);

                    Button negative = (Button) dialo.findViewById(R.id.negative);
                    negative.setText(ctx.getString(R.string.cancel));
                    Button positive = (Button) dialo.findViewById(R.id.positive);
                    positive.setText(ctx.getString(R.string.Delete));

                    title.setText(ctx.getString(R.string.d));
                    body.setText(ctx.getString(R.string.q_delete) + " " + test.getName() + " " + ctx.getString(R.string.de_comp));

                    negative.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            dialo.dismiss();
                        }
                    });

                    positive.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View vir) {

                            TestDatabase tb = new TestDatabase(ctx);
                            SemesterDatabase semesterDatabase = new SemesterDatabase(ctx);
                            tb.deleteTest(holder.posito, semesterDatabase.getSelected().getName());
                            MarksAdapter.this.notifyItemRemoved(holder.posito);

                            marks.remove(holder.posito);

                            for (int i = 0; i < marks.size(); i++) {
                                if(!(marks.get(i) instanceof Test)) {
                                    String sub = String.valueOf(marks.get(i));
                                    if(db.isNoValue(sub,selectedSem)){
                                        marks.remove(i);
                                        notifyItemRemoved(i);
                                    }
                                }

                            }


                            dialo.dismiss();
                        }
                    });
                    dialo.show();

                    return true;
                }
            });
        }else {
            holder.group.setVisibility(View.VISIBLE);
            holder.card.setVisibility(View.GONE);
        //group
            if(holder.posito == 0) {
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)holder.group.getLayoutParams();
                params.setMargins(0,0,0,0);
                holder.group.setLayoutParams(params);
            }
            String sub = String.valueOf(marks.get(holder.posito));
            holder.groupTitle.setText(sub);
            holder.groupMark.setText(db.getTotalSubjectMarks(sub,selectedSem));
        }


    if(lastPosition < holder.posito) {
        if(holder.card.getVisibility() == View.VISIBLE) {
            Animation slide = AnimationUtils.loadAnimation(ctx, R.anim.marks);
            slide.setInterpolator(new AccelerateInterpolator());
            slide.setDuration(700);
            offset += 100;
            slide.setStartOffset(offset);
            holder.card.startAnimation(slide);
        } else {
            Animation slide = AnimationUtils.loadAnimation(ctx, R.anim.mark_groups);
            slide.setInterpolator(new AccelerateInterpolator());
            slide.setDuration(700);
            offset += 50;
            slide.setStartOffset(offset);
            holder.group.startAnimation(slide);
            }
        lastPosition = holder.posito;
    }
    }


@Override
public int getItemCount() {
    return marks.size();
}
}
公共类MarksAdapter扩展了RecyclerView.Adapter{
公共类MyHolder扩展了RecyclerView.ViewHolder{
相对优待卡;
文本视图标题;
文本视图总数;
视图分割器;
正整数;
相对年轻组;
文本视图组标题;
文本视图组标记;
公共MyHolder(查看项目视图){
超级(项目视图);
this.card=(RelativeLayout)itemView.findViewById(R.id.card);
this.title=(TextView)itemView.findViewById(R.id.title);
this.total=(TextView)itemView.findViewById(R.id.mark);
this.divider=itemView.findviewbyd(R.id.item\u divider);
this.group=(RelativeLayout)itemView.findViewById(R.id.group);
this.groupTitle=(TextView)itemView.findViewById(R.id.group\u title);
this.groupMark=(TextView)itemView.findViewById(R.id.group\u标记);
}
}
最终ArrayList标记;
上下文ctx;
字符串选择SEM;
数据库数据库;
公共标记适配器(上下文c、ArrayList标记、字符串sem、TestDatabase db、ArrayList部分){
这个。标记=标记;
ctx=c;
selectedSem=sem;
这个.db=db;
}
@凌驾
public MyHolder onCreateViewHolder(视图组父级,int-viewType){
返回新的MyHolder(LayoutInflater.from(ctx).充气(R.layout.mark_child,parent,false));
}
int lastPosition=-1;
整数偏移=0;
@凌驾
公共无效onBindViewHolder(最终MyHolder,最终int定位器){
holder.posito=定位器;
if(marks.get(holder.posito).getClass()==Test.class){
holder.group.setVisibility(View.GONE);
//标记
最终测试=(测试)标记。获取(定位器);
holder.title.setText(test.getName());
holder.total.setText(String.format(ctx.getString(R.String.new\m\u sum)、test.getMarkGot()、test.getMarkOver());
//加在这里
holder.card.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意图i=新意图(ctx,addTest.class);
测试标记=(测试)标记.get(holder.posito);
i、 putExtra(“t_name”,mark.getName());
i、 putExtra(“subject”,mark.getSubject());
i、 putExtra(“mark_-got”,mark.getMarkGot());
i、 putExtra(“mark_over”,mark.getMarkOver());
i、 putExtra(“模式”、“编辑”);
i、 putExtra(“oldId”,mark.getId());
星触觉(i);
}
});
持卡人。可设置长点击(真);
holder.card.setOnLongClickListener(新视图.OnLongClickListener(){
@凌驾
仅长按公共布尔值(最终视图v){
最终对话框dialo=新对话框(ctx);
dialo.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
dialo.setContentView(R.layout.material_对话框);
TextView title=(TextView)dialo.findviewbyd(R.id.title);
TextView body=(TextView)dialo.findviewbyd(R.id.body);
按钮负数=(按钮)dialo.findViewById(R.id.negative);
negative.setText(ctx.getString(R.string.cancel));
按钮正=(按钮)拨号findViewById(R.id.positive);
positive.setText(ctx.getString(R.string.Delete));
title.setText(ctx.getString(R.string.d));
body.setText(ctx.getString(R.string.q_delete)+“”+test.getName()+“”+ctx.getString(R.string.de_comp));
negative.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
dialo.discouse();
}
});
positive.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(查看vir){
TestDatabase tb=新的TestDatabase(ctx);
SemesterDatabase SemesterDatabase=新的SemesterDatabase(ctx);
tb.deleteTest(holder.posito,semesterDatabase.getSelected().getName());
MarksAdapter.this.notifyItemRemoved(holder.posito);
标记。移除(保持架。位置);
对于(int i=0;iif(marks.get(holder.posito).getClass() == Test.class) {
        holder.card.setVisibility(View.Visible); //add back this
        holder.group.setVisibility(View.GONE);