2017-09-26 1 views
-1

Ich habe eine benutzerdefinierte Listenansicht, die zum Füllen einer Liste verwendet wird, so dass jedes Element seinen eigenen editiertext hat. Wenn ich auf sie klicke und einen Wert eintippe, und danach die Soft-Tastatur (kleiner nach unten zeigender Pfeil in der linken unteren Ecke der Tastatur) verberge, verliert der Editiertext den eingegebenen Text.Android benutzerdefinierte ListView - Edittext wird gelöscht, wenn die Soft-Tastatur versteckt

Warum und wie kann ich das verhindern?

Danke!

Der Code des Adapters:

public class CompetitorResultWeightListAdapter extends ArrayAdapter<Competitor> { 

    Helper helper = new Helper(getContext()); 

    private DatabaseReference databaseResult; 

    private Activity context; 
    private List<Competitor> competitorList; 
    private WodResult wodResult; 

    public CompetitorResultWeightListAdapter(Activity context, List<Competitor> competitorList) { 
     super(context, R.layout.competitor_result_weight_list_layout, competitorList); 
     this.context = context; 
     this.competitorList = competitorList; 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     helper.logD("in CompetitorResultWeightListAdapter - getView"); 
     databaseResult = FirebaseDatabase.getInstance().getReference("Competitions").child(helper.getsCompetitionID()) 
       .child("Wods").child(helper.getsWodID()).child("Results"); 

     LayoutInflater layoutInflater = context.getLayoutInflater(); 

     convertView = layoutInflater.inflate(R.layout.competitor_result_weight_list_layout, null, true); 

     final ViewHolder viewHolder = new ViewHolder(); 

     TextView tvCompetitorListName = (TextView) convertView.findViewById(R.id.tvCompetitorListName); 
     TextView tvCompetitorListNumber = (TextView) convertView.findViewById(R.id.tvCompetitorListNumber); 
     viewHolder.etWeight = (EditText) convertView.findViewById(R.id.etCompetitorResultWeight); 
     viewHolder.btnSaveResult = (ImageButton) convertView.findViewById(R.id.btnCompetitorResultRepeat); 
     convertView.setTag(viewHolder); 

     Competitor competitor = competitorList.get(position); 

     tvCompetitorListName.setText(competitor.getCompetitorName()); 
     tvCompetitorListNumber.setText("Rajtszám: " + competitor.getCompetitorNumber()); 

     //viewHolder.etWeight.setHint("működik"); 
     //etCompetitorResultWeight.setInputType(InputType.TYPE_NULL); 
     //etCompetitorResultWeight.setTextIsSelectable(true); 

     viewHolder.btnSaveResult.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       viewHolder.etWeight.setHint(viewHolder.etWeight.getText() + " kg"); 
       helper.logD("Edittext text at position " + position + ": " + viewHolder.etWeight.getText().toString().trim()); 
       helper.setsCompetitorID(getItem(position).getCompetitorID()); 
       addWodResult(getItem(position).getCompetitorID(), 
         getItem(position).getCompetitorName(), 
         viewHolder.etWeight.getText().toString().trim()); 
      } 
     }); 

     return convertView; 
    } 

    private void addWodResult(String id, String name, String result) { 
     helper.logD("in addWodResult"); 
     helper.logD("id: " + id + ", name: " + name + ", result: " + result); 

     wodResult = new WodResult(id, name, result); 

     databaseResult.child(helper.getsCompetitorID()).setValue(wodResult).addOnCompleteListener(new OnCompleteListener<Void>() { 
      @Override 
      public void onComplete(@NonNull Task<Void> task) { 
       if (task.isSuccessful()) { 
        helper.makeToast(getContext().getResources().getString(R.string.wod_result_data_saved), helper.toastShort); 
        //viewHolder.btnRepeatResult.setBackgroundColor(Color.GREEN); 
       } else { 
        helper.makeToast(getContext().getResources().getString(R.string.firebase_data_stored_error), helper.toastShort); 
       } 
      } 
     }); 
    } 

    public class ViewHolder { 
     EditText etWeight; 
     ImageButton btnSaveResult; 
    } 
} 
+0

Sie verwendet haben der 'ViewHolder', scheint es als hättest du nicht. – samirk433

+0

Nein, habe ich nicht. Ich ändere es und gebe Ihnen ein Update, danke. – lpasztor

+0

Das Gleiche mit Viewholder. Ich bearbeite die Frage und füge den Code hinzu. Überprüfen Sie bitte das. – lpasztor

Antwort

0

Es klingt wie Ihre Aktivität/Fragment entfernt die Tastatur geht jedes Mal wieder aufgebaut werden wird, kann. Fügen Sie in Ihrem onStart() einige Protokollanweisungen ein, um festzustellen, ob dies der Fall ist.

Am allerwenigsten können Sie versuchen, in dem Manifest einige configChanges auf Ihre Aktivität hinzufügen:

<activity android:name=".MyActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:label="@string/app_name"> 

Es ist auch möglich, dass Sie das Listview/Adapter sind neu zu erstellen, die auch alle Werte zurückgesetzt. Setzen Sie Protokollanweisungen dort, wo die ListView aufgefüllt ist, um zu sehen, ob diese mehrfach aufgerufen werden. Normalerweise sollte dieser Zustand gespeichert werden.

Sie auch in Betracht ziehen sollten die Daten des Benutzers in einer temporären Weise (Vorlieben, Singleton Ebene Objekt), sobald sie der Eingabe fertig Einsparung - Sie diese verwenden können, aber es gibt auch andere Möglichkeiten: https://developer.android.com/reference/android/text/TextWatcher.html

+0

Ich überprüfte (deinem Rat folgend) und die getview des Adapters wird mehrere Male auf Tastaturverbergen genannt, selbst wenn ich innerhalb eines edittext klicke ... Das ist nicht gut. – lpasztor

+0

getView wird aufgerufen, wenn die Elemente, die normalerweise hinter der Tastatur stehen, ausgefüllt werden. Ich mache mir mehr Sorgen, dass der ganze Adapter neu gemacht wird. – wblaschko

+0

Das habe ich gemacht, ich habe den ganzen Adapter von Null umgeschrieben, aber das Ergebnis ist das gleiche. – lpasztor

Verwandte Themen