2016-06-12 13 views
1

Ich habe ein Problem, das ich seit ein paar Wochen nicht lösen konnte. Ich habe eine App, die beim Klicken auf die Schaltfläche zwei EditTexts und eine CheckBox hinzufügt. Wenn ich jedoch in den EditTexts etwas Inhalt eintippe und dann nach unten scrolle, verschwindet der Inhalt, wenn ich zurück scrolle. Ich kann keine Lösung dafür finden. Ich habe ein paar andere sehr ähnliche Posts gefunden, aber ich habe alle Lösungen ausprobiert, die ich finden kann, aber keine scheint mir den Trick zu geben. Hier sind ein paar ähnliche Beiträge, die ich gefunden:EditText Inhalt verlieren nach dem Scrollen in RecyclerView

Ich habe vor kurzem einige Änderungen an meinem Programm in Versuch gemacht, dies auch zu beheben. Ich habe meiner MainActivity eine ArrayList hinzugefügt und sie an meinen Adapter übergeben. Ich habe auch zwei benutzerdefinierte Text-Listener, in denen onTextChanged, ich die Zeichenfolge der ArrayList hinzugefügt. In onBindViewHolder aktualisiere ich dann die Position in den Text-Listeners und setze den Text dann auf den String in der ArrayList an dieser Position. Dies führt jedoch zu merkwürdigen Fehlern. Wenn ich nun einen Inhalt zu einem EditText hinzufüge und nach unten scrolle, fügt er ihn zu mehreren EditTexts hinzu und ändert sogar den Inhalt in einigen davon. Ich bin mir nicht sicher, wie ich das beheben soll.

Auch, in einem anderen Hinweis, habe ich die App für Drag & Drop aktiviert und streichen, um zu entlassen. Bitte berücksichtigen Sie das auch, wenn Sie eine Lösung haben. Vielen Dank!

MainActivity

import android.content.ClipData; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.helper.ItemTouchHelper; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    private ArrayList<ListItems> itemsList; 
    private RecyclerView mRecyclerView; 
    private MyRecyclerAdapter adapter; 
    private List<String> courseStrings = new ArrayList<>(); 
    private List<String> creditStrings = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     courseStrings.add(""); 
     creditStrings.add(""); 

     // Toast variable in order to fix toast queueing issue. 
     final Toast toast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT); 

     // For the recycler view. 
     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 

     itemsList = new ArrayList<>(); 
     adapter = new MyRecyclerAdapter(MainActivity.this, itemsList, courseStrings, creditStrings); 
     mRecyclerView.setAdapter(adapter); 
     mRecyclerView.setLayoutManager(linearLayoutManager); 

     // For the addCourse button. 
     final Button addCourse = (Button) findViewById(R.id.addCourse); 
     addCourse.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       adapter.createListItem(new ListItems(null, null, false), toast); 
       toast.setText("New course added"); 
       toast.show(); 
      } 
     }); 

     final Button clearAll = (Button) findViewById(R.id.clearAll); 
     clearAll.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // In order to clear the list. 
       if (itemsList.size() == 0) { 
        toast.setText("All courses have already been cleared."); 
        toast.show(); 
       } else { 
        adapter.clearAdapter(); 
        toast.setText("All courses have been cleared."); 
        toast.show(); 
       } 
      } 
     }); 

     // For the drag and drop/swipe to dismiss. 
     ItemTouchHelper itemTouchHelper = new ItemTouchHelper(
       new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 
         ItemTouchHelper.LEFT) { 
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
         final int fromPos = viewHolder.getAdapterPosition(); 
         final int toPos = target.getAdapterPosition(); 
         Collections.swap(itemsList, fromPos, toPos); 
         adapter.notifyItemMoved(fromPos, toPos); 
         return true; 
        } 
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
         adapter.onItemDismiss(viewHolder.getAdapterPosition()); 
        } 
       }); 
     itemTouchHelper.attachToRecyclerView(mRecyclerView); 
    } // End of onCreate 
} // End of MainActivity 

MyRecyclerAdapter

import android.app.Activity; 
import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.helper.ItemTouchHelper; 
import android.text.Editable; 
import android.text.InputType; 
import android.text.TextWatcher; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.view.LayoutInflater; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.CustomRowViewHolder> { 

    private ArrayList<ListItems> itemsList; 
    private Context mContext; 
    private List<String> courseStrings; 
    private List<String> creditStrings; 


    public MyRecyclerAdapter(Context context, ArrayList<ListItems> itemsList, List<String> courseStrings, List<String> creditStrings){ 
     this.itemsList = itemsList; 
     this.mContext = context; 
     this.courseStrings = courseStrings; 
     this.creditStrings = creditStrings; 
    } 

    @Override 
    public MyRecyclerAdapter.CustomRowViewHolder onCreateViewHolder(final ViewGroup viewGroup, int position) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.new_course_row, null); 
     final CustomRowViewHolder holder = new CustomRowViewHolder(v, new CoursesCustomTextListener(), new CreditsCustomTextListener()); 
     holder.creditsText.setInputType(InputType.TYPE_CLASS_NUMBER); 
     holder.checkBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(holder.checkBox.isChecked()) { 
        holder.courseText.setEnabled(false); 
        holder.courseText.setFocusable(false); 
        holder.courseText.setInputType(InputType.TYPE_NULL); 
        holder.creditsText.setEnabled(false); 
        holder.creditsText.setFocusable(false); 
        holder.creditsText.setInputType(InputType.TYPE_NULL); 
       } else { 
        holder.courseText.setEnabled(true); 
        holder.courseText.setFocusable(true); 
        holder.courseText.setFocusableInTouchMode(true); 
        holder.courseText.setInputType(InputType.TYPE_CLASS_TEXT); 
        holder.creditsText.setEnabled(true); 
        holder.creditsText.setFocusable(true); 
        holder.creditsText.setFocusableInTouchMode(true); 
        holder.creditsText.setInputType(InputType.TYPE_CLASS_NUMBER); 
       } // End if else 
      } 
     }); 
     return holder; 
    } // End of onCreateViewHolder 

    @Override 
    public void onBindViewHolder(CustomRowViewHolder holder, final int position) { 
     ListItems listItem = itemsList.get(position); 
     int focusedItem = 0; 
     holder.itemView.setSelected(focusedItem == position); 
     holder.getLayoutPosition(); 

     holder.creditsCustomTextListener.updatePosition(position); 
     holder.creditsCustomTextListener.updatePosition(position); 

     holder.courseText.setText(courseStrings.get(position)); 
     holder.creditsText.setText(creditStrings.get(position)); 

     // Set listener to check box. 
     holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
       itemsList.get(position).setIsComplete(b); 
      } 
     }); 
     holder.checkBox.setChecked( itemsList.get(position).getIsComplete()); 
    } // End of onBindViewHolder 

    public void clearAdapter() { 
     itemsList.clear(); 
     notifyDataSetChanged(); 
    } // End of clearAdapter 

    public int getItemCount() { 
     return(null != itemsList ? itemsList.size() : 0); 
    } // End of getItemCount 

    public void onItemDismiss(int position) { 
     itemsList.remove(position); 
     notifyItemRemoved(position); 
     notifyItemRangeChanged(position, itemsList.size()); 
    } // End of onItemDismiss 

    public void createListItem(ListItems listItem, Toast toast) { 
     itemsList.add(listItem); 
     int position = itemsList.indexOf(listItem); 
     notifyItemInserted(position); 
    } // End of createListItem 

    ///////////////////////////////////// CustomRowViewHolder ///////////////////////////////////// 

    public static class CustomRowViewHolder extends RecyclerView.ViewHolder { 

     public EditText courseText; 
     public EditText creditsText; 
     public CheckBox checkBox; 
     public RelativeLayout relativeLayout; 
     public CoursesCustomTextListener coursesCustomTextListener; 
     public CreditsCustomTextListener creditsCustomTextListener; 

     public CustomRowViewHolder(View view, CoursesCustomTextListener coursesCustomTextListener, CreditsCustomTextListener creditsCustomTextListener) { 
      super(view); 
      this.coursesCustomTextListener = coursesCustomTextListener; 
      this.creditsCustomTextListener = creditsCustomTextListener; 
      this.courseText = (EditText) view.findViewById(R.id.course); 
      this.creditsText = (EditText) view.findViewById(R.id.credits); 
      this.checkBox = (CheckBox) view.findViewById(R.id.complete); 
      this.relativeLayout = (RelativeLayout) view.findViewById(R.id.relLayout); 
      this.courseText.addTextChangedListener(coursesCustomTextListener); 
      this.creditsText.addTextChangedListener(creditsCustomTextListener); 
     } 
    } 

    ////////////////////////////////// CoursesCustomTextListener ////////////////////////////////// 

    private class CoursesCustomTextListener implements TextWatcher { 
     private int position; 

     public void updatePosition(int position) { 
      this.position = position; 
     } 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // No operation to perform. 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      courseStrings.add(s.toString()); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // No operation to perform. 
     } 
    } 

    ////////////////////////////////// CreditsCustomTextListener ////////////////////////////////// 

    private class CreditsCustomTextListener implements TextWatcher { 
     private int position; 

     public void updatePosition(int position) { 
      this.position = position; 
     } 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // No operation to perform. 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      creditStrings.add(s.toString()); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // No operation to perform. 
     } 
    } 
} // End of MyRecyclerAdapter 

Listitems

import java.util.ArrayList; 

public class ListItems { 
    private String course; 
    private String credits; 
    private Boolean complete; 

    public ListItems(String mCourse, String mCredits, Boolean mComplete) { 
     course = mCourse; 
     credits = mCredits; 
     complete = mComplete; 
    } 

    public String getCourse() { 
     return course; 
    } 

    public void setCourse(String course) { 
     this.course = course; 
    } 

    public String getCredits() { 
     return credits; 
    } 

    public void setCredits(String credits) { 
     this.credits = credits; 
    } 

    public Boolean getIsComplete() { 
     return complete; 
    } 

    public void setIsComplete(Boolean complete) { 
     this.complete = complete; 
    } 
} // End of ListItems 

new_course_row.xml

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/relLayout" 
    android:layout_margin="5dp"> 

    <EditText 
     android:layout_width="130dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/course" 
     android:hint="Enter Course ID" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:textSize="16sp" 
     android:maxLines="1" /> 

    <EditText 
     android:layout_width="115dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/credits" 
     android:hint="Enter Credits" 
     android:layout_alignBottom="@+id/course" 
     android:textSize="16sp" 
     android:layout_toRightOf="@+id/course" 
     android:maxLines="1" /> 

    <CheckBox 
     android:layout_width="100dp" 
     android:layout_height="wrap_content" 
     android:text="Check if complete" 
     android:id="@+id/complete" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignBottom="@+id/course" 
     android:textSize="13sp" 
     android:paddingBottom="4dp" 
     android:paddingTop="4dp" /> 

</RelativeLayout> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingRight="10dp" 
    android:paddingLeft="10dp" 
    android:paddingTop="10dp" 
    android:paddingBottom="10dp" 
    android:id="@+id/rl" 
    tools:context=".MainActivity" > 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add Course" 
     android:id="@+id/addCourse" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:textColor="#FFF" 
     android:background="@drawable/my_button" 
     android:textSize="18dp" 
     android:paddingRight="5dp" 
     android:paddingLeft="5dp" 
     android:paddingTop="15dp" 
     android:paddingBottom="15dp"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Clear All" 
     android:id="@+id/clearAll" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:textColor="#FFF" 
     android:background="@drawable/my_button" 
     android:textSize="18dp" 
     android:paddingRight="5dp" 
     android:paddingLeft="5dp" 
     android:paddingTop="15dp" 
     android:paddingBottom="15dp"/> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/recycler_view" 
     android:layout_below="@+id/addCourse" 
     android:layout_marginTop="10dp" 
     /> 
</RelativeLayout> 

Vielen Dank im Voraus für jede Hilfe! Ich könnte wirklich eine Lösung verwenden!

EDIT: Ich habe jetzt bemerkt, dass, ich gebe "aaaaaaa" im ersten EditText, dann wird es "a" zu einem EditText weiter unten in der Liste hinzufügen, dann "aa" zu dem EditText nach diesem, dann "aaa", "aaaa", bis es "aaaaaaa" erreicht. Dann wird es ein paar leere EditText's geben, und dann wird es wieder von vorne beginnen. Hier ist ein visueller: Here

EDIT x2: Daran habe ich schon lange nicht mehr gearbeitet und habe keine Antworten bekommen. Habe sogar das "Tumbleweed" -Abzeichen für diesen Beitrag erhalten! Hat jemand Ideen?

Antwort

1

Obwohl ich nicht ganz sicher bin, aber ich glaube, dass dies passiert, weil Recycler View seine Positionen regeneriert. Für Ihren benutzerdefinierten Bearbeitungstext fügen Sie den String '@Override public void onTextChanged hinzu (CharSequence s, int start, int vor, int count) { courseStrings.add (s.toString()); }

für beide Texte bearbeiten. In der Ansicht recyler haben Sie this.courseText implementiert.addTextChangedListener (coursesCustomTextListener);

also jedes Mal, wenn Sie scrollen, wird die onBind-Methode aufgerufen und wenn sich die Position ändert, muss diese ebenfalls aufgerufen werden. Daher muss es regenerieren. Ich bitte Sie zuerst

holder.courseText.setTag(position); 

in onBindViewHolder(). Probieren Sie es für beide Texte einzeln aus. Wenn es funktioniert, dann versuchen Sie

holder.view.setTag(position); 
Verwandte Themen