将数据动态添加到listview中,不会覆盖以前的数据并永久保存它

问题描述:

在下面的程序中,当我点击选项菜单中的Add按钮时,打开一个对话框,其中用户输入数据,然后显示在列表显示。 他的代码有许多问题。将数据动态添加到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(); 

     } 
    }); 

} 

}

+0

1.你可能会得到一个'NullPointerException'。发布堆栈跟踪。 2.你正在用新的适配器“重新设置”你的旧适配器。这就是为什么你得到“过度写入”数据 – Pelocho

+0

你必须创建'arrayList'作为全局变量。目前每次将您创建为新列表时,都会重新创建旧列表 –

+0

对于第三个,您需要使用服务器端存储或像sqLite这样的本地存储来存储数据 –

1)您必须将age的值转换为setText之前的字符串 //age.setText(list.get(position).getAge());

age.setText(Integer.toString(list.get(position).getAge()));

2)每次新的数字化初始化 intarrayList = new ArrayList <>();

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选件的数据保存

要设置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; 
    } 
} 

移动的onClickListener

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

外面这些行因为每当你点击该按钮的ArrayList再次初始化。