动态地向listView添加数据,该数据不会覆盖以前的数据并永久保存

时间:2017-07-26 11:02:31

标签: android listview

在以下程序中,当我单击选项菜单中的“添加”按钮时,将打开一个对话框,其中用户输入数据,然后在ListView中显示该数据。 他的代码存在许多问题。

1)自定义适配器中的age.setText导致应用程序崩溃。评估age.settext行,它适用于其他两个TextView。

2)当我第二次使用对话框在列表中添加数据时,列表会被覆盖并且不会进行更新。 我希望在输入新数据时自动更新列表,而不是过度写入。

3)当我重新启动应用程序时,数据消失了。我希望永久保存数据。

自定义适配器的代码是:

package com.example.sakshi.dialogsandmenus;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import org.w3c.dom.Text;
import java.util.ArrayList;

public class CustomAdapter extends BaseAdapter {
    private Context context;
    private ArrayList<Data> list;
    private LayoutInflater mLayoutInflator;
    public CustomAdapter(Context context, ArrayList list){
    this.context=context;
    this.list=list;
    mLayoutInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = mLayoutInflator.inflate(R.layout.row,null);
    TextView name = (TextView)convertView.findViewById(R.id.name);
    TextView age = (TextView)convertView.findViewById(R.id.agedata);
    TextView dob = (TextView)convertView.findViewById(R.id.dob);
    name.setText(list.get(position).getName());
    //age.setText(list.get(position).getAge());
    dob.setText(list.get(position).getDate());
    return convertView;
    }
}

主要活动代码是:

package com.example.sakshi.dialogsandmenus;

import android.app.Dialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
import static android.R.id.list;
import static com.example.sakshi.dialogsandmenus.R.id.date;

public class MainActivity extends AppCompatActivity{
    ListView listview;
    ArrayList<Data> arrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview = (ListView)findViewById(R.id.list_item);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.menu,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id= item.getItemId();
    if(id==R.id.add){

        filldialog();
    }

    return super.onOptionsItemSelected(item);
}

public void filldialog(){
    final Dialog dialog = new Dialog(MainActivity.this);
    dialog.setCanceledOnTouchOutside(false);
    dialog.setContentView(R.layout.dialog_layout);
    dialog.show();
    Button add = (Button)dialog.findViewById(R.id.additem);
    final EditText getnamedata = (EditText)dialog.findViewById(R.id.name);
    final EditText getagedata = (EditText)dialog.findViewById(R.id.age);
    final DatePicker datePicker = (DatePicker)dialog.findViewById(date);

    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String getname =  getnamedata.getText().toString();
            int getage = Integer.parseInt(getagedata.getText().toString());
            int mm,y,d;
            mm=datePicker.getMonth();
            y=datePicker.getYear();
            d=datePicker.getDayOfMonth();
            String getdate = d+"/"+mm+"/"+y;
            arrayList = new ArrayList<>();

            Data data = new Data();
            data.setName(getname);
            data.setAge(getage);
            data.setDate(getdate);
            arrayList.add(data);


            CustomAdapter customAdapter = new CustomAdapter(MainActivity.this,arrayList);
            listview.setAdapter(customAdapter);
            //customAdapter.notifyDataSetChanged();
            dialog.dismiss();

        }
    });

}

}

3 个答案:

答案 0 :(得分:0)

您正在将int值直接设置为ageTextView的setText。在将文本设置为TextView之前,需要将int转换为String。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = mLayoutInflator.inflate(R.layout.row,null);
    TextView name = (TextView)convertView.findViewById(R.id.name);
    TextView age = (TextView)convertView.findViewById(R.id.agedata);
    TextView dob = (TextView)convertView.findViewById(R.id.dob);
    name.setText(list.get(position).getName());
    //age.setText(list.get(position).getAge());
    age.setText(String.valueOf(list.get(position).getAge())); // use this it will work
    dob.setText(list.get(position).getDate());
    return convertView;
    }
}

答案 1 :(得分:0)

将这些行移到onClickListener

之外
arrayList = new ArrayList<>();
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this,arrayList);
listview.setAdapter(customAdapter);

因为无论何时点击按钮,arraylist都会再次初始化。

答案 2 :(得分:0)

1)你必须在setText之前将age的值转换为String //age.setText(list.get(position).getAge());

age.setText(Integer.toString(list.get(位置).getAge()));

2)每次新的Arraylist初始化  intarrayList = new ArrayList&lt;&gt;();

ArrayList arrayList = new ArrayList<>();
public void filldialog(){
    final Dialog dialog = new Dialog(MainActivity.this);
    dialog.setCanceledOnTouchOutside(false);
    dialog.setContentView(R.layout.dialog_layout);
    dialog.show();
    Button add = (Button)dialog.findViewById(R.id.additem);
    final EditText getnamedata = (EditText)dialog.findViewById(R.id.name);
    final EditText getagedata = (EditText)dialog.findViewById(R.id.age);
    final DatePicker datePicker = (DatePicker)dialog.findViewById(date);

    CustomAdapter customAdapter = new CustomAdapter(MainActivity.this,arrayList);
    listview.setAdapter(customAdapter);
    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String getname =  getnamedata.getText().toString();
            int getage = Integer.parseInt(getagedata.getText().toString());
            int mm,y,d;
            mm=datePicker.getMonth();
            y=datePicker.getYear();
            d=datePicker.getDayOfMonth();
            String getdate = d+"/"+mm+"/"+y;

            Data data = new Data();
            data.setName(getname);
            data.setAge(getage);
            data.setDate(getdate);
            arrayList.add(data);
            customAdapter.notifyDataSetChanged();
            dialog.dismiss();

        }
    });

在这里输入代码

3)使用Sqlite或anyStorage选项进行数据保存