2017-07-19 1 views
0

Ich habe ein benutzerdefiniertes Layout für das Listenelement, das ein Kontrollkästchen und ein EditText-Feld enthält. Wenn Sie auf die Schaltfläche Hinzufügen klicken, wird zwar ein neues Objekt hinzugefügt, aber die Liste wird gelöscht. Alle vorherigen Daten verschwinden. Ich bin so auf Android lass es mich wissen, wo ich falsch werde ...Alle ListView-Elemente werden gelöscht, wenn eine neue Zeile hinzugefügt wird

Hier ist meine MainActivity:

public class MainActivity extends AppCompatActivity { 

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

    // ArrayList for items 
    final ArrayList<Item> itemArrayList = new ArrayList<>() ; 

    // CheckBox and EditText 
    CheckBox checkBox = (CheckBox) findViewById(R.id.default_checkbox) ; 
    EditText editText = (EditText) findViewById(R.id.default_edit_text) ; 

    // Add Button 
    Button addButon = (Button) findViewById(R.id.add_button); 

    // Item Adapter 
    final ItemAdapter itemAdapter = new ItemAdapter(this, itemArrayList) ; 

    // ListView Object 
    final ListView listView = (ListView) findViewById(R.id.list) ; 

    // Set Adapter 
    listView.setAdapter(itemAdapter); 

    // Setting the onClick Listener 
    addButon.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      CheckBox cBox = new CheckBox(MainActivity.this); 
      //EditText eText = new EditText(MainActivity.this) ; 

      itemArrayList.add(new Item(cBox, "")) ; 
      itemAdapter.notifyDataSetChanged() ; 
     } 
    }); 
} 
} 

Und hier ist meine Adapter Klasse:

public class ItemAdapter extends ArrayAdapter<Item> { 

// Arraylist 
private ArrayList<Item> itemsArrayList = new ArrayList<>() ; 

//Constructor 
/*@param context This is the class which is sent as the context 
* @param items This is the ArrayList 
* @param resource Extra elements*/ 
public ItemAdapter(@NonNull Context context, ArrayList<Item> items) { 
    super(context,0, items); 
} 

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

    View listView = convertView ; 

    if (listView == null) { 
     listView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); 
    } 

    // Item at index position 
    Item currentItem = getItem(position) ; 

    // Initializing elements 
    CheckBox checkBox = (CheckBox) listView.findViewById(R.id.default_checkbox); 
    EditText editText = (EditText) listView.findViewById(R.id.default_edit_text); 

    // Setting the state of CheckBox 
    if (currentItem.getCheckBox().isChecked()) { 
     checkBox.setChecked(true); 
    } else { 
     checkBox.setChecked(false); 
    } 

    // Setting the state of EditText 
    editText.setText(currentItem.getCheckBoxText()); 

    return listView; 
} 
} 

Die Item-Klasse:

public class Item { 

// CheckBox 
private CheckBox checkBox ; 

// Text 
private String checkBoxText ; 

// Constructor 

//* @param rootView This is the layout which contains the checkBox and editText element 
//* @param cBox This is the checkBox 
//* @param text This is the text alongside the checkBox 
public Item(CheckBox cBox, String text){ 
    // Initializing the Item 
    checkBox = cBox ; 
    checkBoxText = text ; 
} 

// Method to get checkBox 
public CheckBox getCheckBox(){ 
    return checkBox ; 
} 

// Method to get checkBoxText 
public String getCheckBoxText(){ 
    return checkBoxText ; 
} 

// Method to set CheckBox 
/* 
* @param cBox This is the checkBox which is set*/ 
public void setCheckBox(CheckBox cBox){ 
    checkBox = cBox ; 
} 

// Method to set checkBoxText 
public void setCheckBoxText(String text){ 
    checkBoxText = (text) ; 
} 
} 

Antwort

0

versuchen Sie dies. Fügen Sie diese Methode in Ihrem Adapter

public void addNewItem(Item item) 
{ 
    itemsArrayList.add(item); 
} 

nun wie unten in Sie klicken

itemAdapter.add(new Item(cBox, eText.getText().toString())) ; 
itemAdapter.notifyDataSetChanged() ; 
+0

Ich habe das versucht, aber es funktioniert immer noch nicht .. – heytherebrowncow

0

neues Element hinzufügen Wenn Sie diese Methode aufrufen, werden Sie ein neues Element in die Liste Sie auf den übergebenen Adapter.

Jetzt initialisieren Sie Ihre Referenz der Liste nicht innerhalb des Adapters, sondern übergeben sie an die Elternklasse.

fügen Sie diese Zeile in Ihrem Adapter Konstruktor

this.itemsArrayList = items; 

, die es ist.

+0

Danke für die Hilfe, aber es funktioniert immer noch nicht. Ich bin nicht in der Lage, das Problem zu verstehen ... – heytherebrowncow

+0

Also überprüfte ich Ihren Code ein wenig mehr im Detail und bemerkte, dass Sie die Ansichten in der Liste hinzufügen, anstatt die Daten, dies sollte nicht getan werden, sollten Sie erstellen eine neue Datenmenge wie Checkbox-Status und Text für Edittext und nicht die Ansichten selbst, nur dann würde der Status beibehalten. –

+0

Okay, ich habe getan, wie du gesagt hast ... aber alle Zeilen werden immer noch gelöscht, wenn ich den Hinzufügen-Knopf drücke oder wenn ich den Zurück-Softkey meines Telefons drücke .... – heytherebrowncow

Verwandte Themen