2016-05-13 2 views
0

Ich versuche zu speichern oder Daten von ListView zu erhalten, die EditText enthält. Wenn ich versuche, Daten von ListView mit Zeilen über Bildschirmgröße zu speichern oder zu erhalten, erhalte ich den Fehler. Ich weiß warum, aber ich weiß nicht, wie ich es beheben kann. Der Grund ist, dass sie die Ansichten wiederverwenden.Wie kann ich Daten in Listview speichern, wenn deren Größe die Bildschirmgröße überschreitet?

Hier ist das Beispiel, was ich tun möchte. Wenn es 5 Zeilen im Bildschirm und 1 Reihe außerhalb des Bildschirms gibt, wie kann ich dann auf die 6. Zeile zugreifen?

public void saveData(){ 
     StringBuffer buffer = new StringBuffer(); 
     int count = listView.getCount(); 
     for(int i=0 ;i < count ;i++) { 
      View child = listView.getChildAt(i); 
      TextView setText1 = (TextView)child.findViewById(R.id.TextView1); 
      EditText text = (EditText) child.findViewById(R.id.setText1); 
      String content1 = setText1.getText().toString().trim(); 
      String content2 = text.getText().toString().trim(); 
      buffer.append(content1); 
      buffer.append(","); 
      buffer.append(content2); 
      buffer.append(",");    
    } 

I Speichern von Daten in Stringbuffer.

public class CustomAdapter extends ArrayAdapter<String> { 

    public CustomAdapter(Context context, List<String> num_set) { 
     super(context, R.layout.custom_row ,num_set); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     View CustomView = inflater.inflate(R.layout.custom_row ,parent , false); 


     String[] num = getItem(position).split(","); 
     TextView setText1 = (TextView)CustomView.findViewById(R.id.TextView1); 
     EditText setText2 =(EditText)CustomView.findViewById(R.id.setText2); 

     setText1.setText(num[0]); 
     setText2.setText(num[1]); 
     return CustomView; 
    } 

} 

hier ist der logcat. verursacht durch:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 

hier ist die custom_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:weightSum="1"> 

    <TextView 
     android:id="@+id/TextView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Text" /> 

    <EditText 
     android:id="@+id/setText1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:enabled="true" 
     android:inputType="numberDecimal" 
     android:textSize="24sp" /> 
</LinearLayout> 
+0

teilen Sie Ihren Adapter-Code. –

+0

teilen Fehler logcat. –

+0

@jankigadhiya Ich habe es getan –

Antwort

0
editText.addTextChangedListener(new TextWatcher() { 
       @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) { 

       } 
      }); 

Verwendung AddText listner und speichert, wenn Sie ein Datum in EditText schreiben, so dass Sie bestimmte Daten erhalten.

0

Sie sollten die Daten von den Ansichten trennen. Denn mit ListViews existieren Zeilen, die nicht auf dem Bildschirm vorhanden sind, nicht! Wenn Sie etwas in einer Zeile eingeben, scrollen Sie es aus dem Bildschirm heraus und Sie werden feststellen, dass der Text verschwunden ist.

Ich schlage vor, Sie verwenden etwas wie Arjun's answer, um die Daten in der onTextChanged irgendwo zu speichern. Auf diese Weise können Sie den Text beim Scrollen auch wieder wiederherstellen.

Ich sehe auch, dass Sie keine Verwendung der Zeile wieder verwenden (mit dem Argument convertView des Adapters). Ich schlage vor, dass Sie auch in das ViewHolder-Muster hineinlesen, weil Sie jedes Mal eine neue Zeile erstellen

Verwandte Themen