2016-06-04 10 views
0

Ich habe viel Ärger mit diesem, und ich kann Dinge zu meinem Problem durch eine Suche finden, aber sie scheinen nicht mein Problem zu beheben, und ich habe es versucht alles was ich kann. Ich kann nicht scheinen, dieses Problem für das Leben von mir zu beheben.EditText Inhalt in RecyclerView verschwindet und springt um

Also habe ich eine App, College-Kurse zu verfolgen. In dem, ich habe eine Schaltfläche, um einen benutzerdefinierten Ansichtshalter zu einem RecyclerView hinzuzufügen. Dieser benutzerdefinierte Ansichtshalter enthält zwei EditText-Felder zusammen mit einer CheckBox. Wenn ich nun auf den Button "Kurs hinzufügen" klicke, werden diese drei Dinge hinzugefügt. Das funktioniert gut. Wenn ich jedoch einen beliebigen Text in das EditText-Feld einfüge und dann einen weiteren Kurs hinzufüge, löscht er alle Inhalte, die zuvor in die EditText-Felder eingegeben wurden. Ich versuche, diesen Inhalt ziemlich dauerhaft zu speichern, oder zumindest bis der Benutzer diese Ansicht löscht (indem ich entweder auf die Schaltfläche "Alle löschen" klicke oder nach links wische). Ich habe jedoch extreme Schwierigkeiten damit. Ich habe versucht, zu jeder Ansicht einen "TextChangedListener" hinzuzufügen, aber ich kann nicht scheinen, dass dies funktioniert. Ich habe versucht, einen benutzerdefinierten Textlistener zu erstellen und ihn in meiner "onCreateViewHolder" -Methode hinzuzufügen, und dann den Text in der "onBindViewHolder" -Methode festzulegen, aber das scheint mein Problem nicht zu lösen.

Mein anderes Problem, von dem ich glaube, dass es wahrscheinlich damit zusammenhängt, tritt auf, wenn ich genug Ansichten in der RecyclerView habe, um nach unten zu scrollen, und ich Text in ein EditText-Feld eingib. Wenn ich dann nach unten scrolle, erscheint der von mir eingegebene Text in anderen EditText-Feldern. Oder wenn ich meine CheckBox ankreuze, dann scrolle ich nach unten, dann werden auch andere Kontrollkästchen aktiviert. Hier sind einige Bilder für ein Visual.

Hier ist, wenn ich einen neuen Kurs hinzufügen, und der Text verschwindet:

Here is when I add a new course, and the text disappears.

Hier ist meine Scrolling Ausgabe:

Here is my scrolling issue.

Hier meine Dateien sind, auch.

Zuerst mein MainActivity.java:

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 java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    private ArrayList<ListItems> itemsList = new ArrayList<ListItems>(); 
    private RecyclerView mRecyclerView; 
    private MyRecyclerAdapter adapter; 

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

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

     // For the addCourse button. 
     final Button addCourse = (Button) findViewById(R.id.addCourse); 
     addCourse.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ListItems.createListItem(itemsList); 
       adapter = new MyRecyclerAdapter(MainActivity.this, itemsList); 
       mRecyclerView.setAdapter(adapter); 
       mRecyclerView.setLayoutManager(linearLayoutManager); 
      } 
     }); 

     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. 
       adapter.clearAdapter(); 
      } 
     }); 

     // 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 

Nun, mein Adapter:

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.EditText; 

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

public class MyRecyclerAdapter extends RecyclerView.Adapter<CustomRowViewHolder> { 

    private ArrayList<ListItems> itemsList; 
    private Context mContext; 
    private int focuseditem = 0; 
    String afterTextChanged = ""; 


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

    @Override 
    public 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 CustomTextListener()); 

     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(final CustomRowViewHolder customRowViewHolder, int position) { 
     ListItems listItem = itemsList.get(position); 
     customRowViewHolder.itemView.setSelected(focuseditem == position); 
     customRowViewHolder.getLayoutPosition(); 
     customRowViewHolder.customTextListener.updatePosition(position, customRowViewHolder); 
     customRowViewHolder.courseText.setText(itemsList.get(position).getCourse()); 
    } // 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 onItemMove(List<ListItems> itemsList, int fromPosition, int toPosition) { 
     Collections.swap(itemsList, fromPosition, toPosition); 
     notifyItemMoved(fromPosition, toPosition); 
    } // End of onItemMove 

} // End of MyRecyclerAdapter 

/** 
* Created by Thomas on 6/3/2016. 
*/ 
class CustomTextListener implements TextWatcher { 
    private int position; 
    private CustomRowViewHolder customRowViewHolder; 

    public void updatePosition(int position, CustomRowViewHolder customRowViewHolder) { 
     this.position = position; 
     this.customRowViewHolder = customRowViewHolder; 
    } 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     customRowViewHolder.courseText.setText(s.toString()); 
    } 
} 

Mein "CustomRowViewHolder.java":

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 

public class CustomRowViewHolder extends RecyclerView.ViewHolder{ 

    protected EditText courseText; 
    protected EditText creditsText; 
    protected CheckBox checkBox; 
    protected RelativeLayout relativeLayout; 
    protected CustomTextListener customTextListener; 

    public CustomRowViewHolder(View view, CustomTextListener customTextListener) { 
     super(view); 
     this.customTextListener = customTextListener; 
     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); 

     view.setClickable(true); 
    } 
} 

schließlich mein „Listitem. Java ":

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; 
    } 

    public static ArrayList<ListItems> createListItem(ArrayList<ListItems> itemsList) { 
     itemsList.add(new ListItems(null, null, false)); 
     return itemsList; 
    } // End of createListItem 

    public static ArrayList<ListItems> removeListItem(ArrayList<ListItems> itemsList) { 
     if (itemsList.size() == 0) { 
      return itemsList; 
     } else { 
      itemsList.remove(0); 
     } // End if 

     return itemsList; 
    } // End of removeListItem 
} // End of ListItems 

Vielen Dank im Voraus für jede Hilfe! Es ist sehr geschätzt, da ich schon sehr lange an diesem Thema festhalte!

+0

Sie müssen Liste Ihrer yourditText-Inhalte pflegen .. !! ! –

Antwort

0

Ich hatte ein ähnliches Problem ... Sie könnten versuchen, ein Feld in ListItems mit dem Text von ediText (oder einer anderen Liste, wenn Sie möchten) hinzufügen. Wichtig ist, einen Verweis auf den vorherigen eingefügten Text und das listItem zu haben. Nehmen wir an, dass unter Prüfung auf Vollständigkeit der Text von ListItem abgerufen und auf dieses Feld gesetzt wird.

Und dann, in Adapter, setText to editText mit dem Wert dieses Feldes.

0

Hinzufügen Methode zu Ihrer Recycler Ansicht zum Einfügen neuer Artikel. oder sie entfernen. wie die

public void addItem(ListItems object) 
{ 
    itemsList.add(object); 
    int pos = itemsList.indexOf(object); 
    notifyItemInserted(pos); 
} 

und dann in Ihrem Add Anruf Kurs Schaltfläche Click-Ereignis Artikel Methode hinzufügen:

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

     List<ListItems> itemsList = new ArrayList<>(); 
     adapter = new MyRecyclerAdapter(MainActivity.this, itemsList); 
     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) { 
      mRecyclerView.getAdapter().addItem(new ListItems(null, null, false)); 

     } 
    }); 

für Sie zweite Ausgabe nur Zustand Check Box in verwandten ListItem speichern Sie es dann gesetzt Kontrollkästchen in onBindViewHolder-Methode: wie folgt:

@Override 
public void onBindViewHolder(final CustomRowViewHolder customRowViewHolder, int position) { 
    ListItems listItem = itemsList.get(position); 
    customRowViewHolder.itemView.setSelected(focuseditem == position); 
    customRowViewHolder.getLayoutPosition(); 
    customRowViewHolder.customTextListener.updatePosition(position, customRowViewHolder); 
    customRowViewHolder.courseText.setText(itemsList.get(position).getCourse()); 

    // just set listener to check box. 
    customRowViewHolder.checkBox.setChecked( itemsList.get(position).getIsComplete()); 
initEditText(customRowViewHolder,itemsList.get(position).getIsComplete()); 
    customRowViewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      itemsList.get(position).setIsComplete(b); 

// for retrieve eidtTexts state 
    initEditText(customRowViewHolder,b); 
    }); 



    //for retrieve text 
    customRowViewHolder.courseText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      itemsList.get(position).setCourse(editable.toString()); 
     } 
    }); 

customRowViewHolder.creditsText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      itemsList.get(position).setCredits(editable.toString()); 
     } 
    }); 

customRowViewHolder.courseText.setText(itemsList.get(position).getCourse()); 
customRowViewHolder.creditsText.setText(itemsList.get(position).getCredits()); 

} // End of onBindViewHolder 

private void initEditText(CustomRowViewHolder customRowViewHolder,boolean b) { 
    if(b) { 
     customRowViewHolder.courseText.setEnabled(false); 
     customRowViewHolder.courseText.setFocusable(false); 
     customRowViewHolder.courseText.setInputType(InputType.TYPE_NULL); 
     customRowViewHolder.creditsText.setEnabled(false); 
     customRowViewHolder.creditsText.setFocusable(false); 
     customRowViewHolder.creditsText.setInputType(InputType.TYPE_NULL); 
    } else { 
     customRowViewHolder.courseText.setEnabled(true); 
     customRowViewHolder.courseText.setFocusable(true); 
     customRowViewHolder.courseText.setFocusableInTouchMode(true); 
     customRowViewHolder.courseText.setInputType(InputType.TYPE_CLASS_TEXT); 
     customRowViewHolder.creditsText.setEnabled(true); 
     customRowViewHolder.creditsText.setFocusable(true); 
     customRowViewHolder.creditsText.setFocusableInTouchMode(true); 
     customRowViewHolder.creditsText.setInputType(InputType.TYPE_CLASS_NUMBER); 
    } // End if else 
} 
+0

Vielen Dank! Ich bin mir nicht sicher, was das ist, aber ich habe meine "createListItem" -Methode in meinen Adapter verschoben und den ganzen Code, den ich in meinem addCourse-Button hatte, verschoben. Ich habe alles verschoben (außer wo ich den Kurs hinzufüge) außerhalb des Knopfes klicken. Jetzt ist mein erstes Problem gelöst! Obwohl ich immer noch Probleme mit dem Scrollen habe. Wenn ich nach dem Aktivieren eines Kontrollkästchens blättern und ein EditText-Feld eingeben, werden andere Kontrollkästchen aktiviert und der Inhalt, den ich eingegeben habe, wird nicht mehr angezeigt. –

+0

können Sie Ihre Frage bearbeiten? –

+0

Ich bearbeite Beitrag Sie können es nicht erneut versuchen –

Verwandte Themen