2017-06-11 3 views
0

Ich habe eine Aktivität, die auf RecyclerView enthält. ein neues Element einzufügen, gibt es einen benutzerdefinierten Dialog, das verwendet auf zwei editText und einen Spinner enthält einige Informationen von Benutzern erforderlich zu bekommen und dann gibt diese Informationen zurück und zeigte sie in recyclerView sehen, das BildAndroid - RecyclerView - Artikel Positionen Problem

enter image description here

Dies ist der benutzerdefinierte Dialog, den ich verwendet habe, um neue Artikel einzufügen, Wenn Sie die Anzahl der einzelnen Artikel sehen, gibt es bis jetzt kein Problem.

enter image description here

, wenn die Soft-Input (Tastatur) angezeigt wird, dann gibt es etwas, was auf die Elemente passieren, die Positionen von einigen von ihnen geändert werden

enter image description here

die Positionen der zu sehen letzte Gegenstände!

es geändert wird

enter image description here

die Schaltfläche Abbrechen auf dem Dialog nichts tut,

dies ist die recycleView nach dem Dialog benutzerdefinierten entlassen

enter image description here

ich denke, das Problem tritt auf, weil das Recycling-Feature.

Adapter für recyclerView verwendet:

private class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> 
{ 
    private View courseView; 
    private TextView courseNo; 
    private TextView courseName ; 
    private TextView courseHours; 
    private TextView courseGrades; 

    protected class ViewHolder extends RecyclerView.ViewHolder{ 

     public ViewHolder(View itemView) { 
      super(itemView); 
      courseView = itemView; 
     } 
    } 

    @Override 
    public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     courseView = LayoutInflater 
       .from(parent.getContext()).inflate(R.layout.view_course,parent,false); 

     courseNo = (TextView)courseView.findViewById(R.id.view_course_textView_no); 
     courseName = (TextView)courseView.findViewById(R.id.view_course_textView_name); 
     courseHours = (TextView)courseView.findViewById(R.id.view_course_textView_hours_value); 
     courseGrades = (TextView)courseView.findViewById(R.id.view_course_textView_grade_value); 

     ViewHolder holder = new ViewHolder(courseView); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int position) { 
     final int coursePosition = position; 
     courseNo.setText(position+1+""); 
     courseName.setText(courses.get(position).getName()); 
     courseHours.setText(courses.get(position).getHours()+""); 
     courseGrades.setText(courses.get(position).getGrade()+""); 

     courseView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       editDialog(coursePosition); 
      } 
     }); 


    } 

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

wo Kurse ist Liste der Artikel

+0

Können Sie hier Ihren Code für den Adapter posten? Ihr Problem ist wahrscheinlich in verbindlichen ViewHolder –

+0

@VarvaraKalinina ok –

Antwort

1

Nun, Sie implementieren Adapter falsch.

Betrachten Sie dieses Beispiel eines ViewHolder:

class CustomViewHolder extends RecyclerView.ViewHolder { 
     protected ImageView imageView; 
     protected TextView textView; 

     public CustomViewHolder(View view) { 
      super(view); 
      this.imageView = (ImageView) view.findViewById(R.id.thumbnail); 
      this.textView = (TextView) view.findViewById(R.id.title); 
     } 
    } 

Ansicht Variablen Felder des ViewHolder sein muss, nicht der Adapter. In Ihrem Fall

private View courseView; 
private TextView courseNo; 
private TextView courseName ; 
private TextView courseHours; 
private TextView courseGrades; 

müssen Felder des ViewHolder, nicht der Adapter sein.

Einstellung onClickListener muss innerhalb gehen onCreateViewHolder(), nicht onBindViewHolder(), oder Sie am Ende mit mehreren wiederholten onClickListeners für den gleichen Artikel.

Und ich glaube nicht, dass Sie einen Verweis auf View courseView überhaupt behalten müssen.