2017-08-14 2 views
0

Ich habe eine erweiterbare Listview, die ich auch hinzufügen kann. Wie kann ich jeden hinzugefügten Artikel speichern? Ich habe versucht, Sharedpreferences mit Gson zu Json zu verwenden, aber das scheint nicht zu funktionieren. Hier ist meine erweiterbar Listenansicht Adapter:So speichern Sie eine erweiterbare Listenansicht in Android?

public class ExpandListAdapter extends BaseExpandableListAdapter { 
    private Context context; 
    private ArrayList<Group> groups; 

    public ExpandListAdapter(Context context, ArrayList<Group> groups) { 
     this.context = context; 
     this.groups = groups; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     ArrayList<Child> chList = groups.get(groupPosition).getItems(); 
     return chList.get(childPosition); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

     Child child = (Child) getChild(groupPosition, 
        childPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) context 
        .getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.child_row, null); 
     } 
     TextView tv = (TextView) convertView.findViewById(R.id.country_name); 
     tv.setText(child.getName().toString()); 

     return convertView; 

    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     ArrayList<Child> chList = groups.get(groupPosition) 
       .getItems(); 

     return chList.size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return groups.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return groups.size(); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     Group group = (Group) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater inf = (LayoutInflater) context 
        .getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView = inf.inflate(R.layout.group_header, null); 
     } 
     TextView tv = (TextView) convertView.findViewById(R.id.group_name); 
     tv.setText(group.getName()); 
     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

Hier ist die Klasse, die erweiterbar Listenansicht verwendet, I-Gruppen mit dem Alertdialog hinzufügen und es fügt auch ein Kind mit dem Namen „Yo“, nur zu Testzwecken:

public class classesScreen extends Activity implements AdapterView.OnItemSelectedListener { 
private ExpandListAdapter ExpAdapter; 
private ExpandableListView ExpandList; 
private Button newHeaderBut; 
static ArrayList<Group> group_list; 
ArrayList<Child> child_list; 
String m_text; 

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

    group_list = new ArrayList<Group>(); 

    ExpandList = (ExpandableListView) findViewById(R.id.classesListView); 
    ExpAdapter = new ExpandListAdapter(this, group_list); 
    ExpandList.setAdapter(ExpAdapter); 


    newHeaderBut = (Button) findViewById(R.id.newClassBut); 

    newHeaderBut.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      AlertDialog.Builder builder = new AlertDialog.Builder(classesScreen.this); 
      builder.setTitle("Add a New Class:"); 

      final EditText input = new EditText(classesScreen.this); 

      builder.setView(input); 

      builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

        m_text = input.getText().toString(); 

        Group gru1 = new Group(); 
        gru1.setName(m_text); 

        child_list = new ArrayList<Child>(); 

        Child ch1 = new Child(); 
        ch1.setName("Yo"); 

        child_list.add(ch1); 

        gru1.setItems(child_list); 

        group_list.add(gru1); 
        ExpAdapter.notifyDataSetChanged(); 
       } 
      }); 

      builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
      builder.show(); 
     }); 
    } 

    public void onItemSelected(AdapterView<?> parent, View view, int position, long id){} 

    public void onNothingSelected(AdapterView<?> arg0) {} 
} 

Ich habe auch zwei Objektklassen namens Group und Child. Ich kann diese zeigen, wenn Sie sie brauchen. Danke im Voraus!

+1

implementieren "So sparen Sie eine erweiterbare Listview in Android?" - Du nicht. Sie speichern die Modelldaten, die zum Auffüllen der 'ExpandableListView' verwendet werden. In diesem Fall werden die Objekte "Group" und "Child" gespeichert. "Ich habe versucht, geteilte Präferenzen mit Gson zu Json zu verwenden, aber das scheint nicht zu funktionieren" - wir können Ihnen nicht mit Code helfen, den wir nicht sehen können. SharedPreferences scheint eine seltsame Wahl zu sein. Sie können die Daten auch in einer einfachen JSON-Datei speichern (z. B. in 'getFilesDir()'). – CommonsWare

+0

Können Sie angeben, warum Sie es nicht mit gson und sharedpreferences speichern konnten? – ravindu1024

+0

@CommonsWare Wie würde ich die Gruppen- und Child-Objekte speichern und sie dann wieder abrufen und die erweiterbare Liste erneut füllen? –

Antwort

0

Make ur Modellklasse Serializable

Speichern Sie Ihre letzte Arraylist in eine Datei

private void saveDataToFile() { 

    FileOutputStream fileOutputStream = null; 
    try { 
     fileOutputStream = getContext().openFileOutput("fileName", Context.MODE_PRIVATE); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e) { 

    } 
    ObjectOutputStream objectOutputStream = null; 
    try { 
     objectOutputStream = new ObjectOutputStream(fileOutputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e) { 

    } 
    try { 
     if (objectOutputStream != null) { 
      objectOutputStream.writeObject(yourArrayList); //which data u want to save 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if (objectOutputStream != null) { 
      objectOutputStream.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Abrufen von Daten aus der Datei

private void getDataFromFile() { 

    FileInputStream fileInputStream = null; 
    try { 
     fileInputStream = getContext().openFileInput("fileName"); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return; 
    } 
    ObjectInputStream objectInputStream = null; 
    try { 
     objectInputStream = new ObjectInputStream(fileInputStream); 
    } catch (IOException |NullPointerException e) { 
     e.printStackTrace(); 
    } 
    try { 
     yourArrayList = (ArrayList<YourClassName>) objectInputStream.readObject(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     objectInputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
+0

Wie und wo würde ich diese Methoden nennen? –

+0

Wenn Sie den Listenaufruf saveDataToFile() speichern müssen. Wenn Sie Daten abrufen müssen, rufen Sie getDataFromFile(); –

+0

Dies funktioniert nicht, ich bekomme keine Fehler, es tut es einfach nicht. –

Verwandte Themen