2017-07-26 108 views
0

在下面的程序中,當我點擊選項菜單中的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這樣的本地存儲來存儲數據 –

回答

0

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選件的數據保存

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; 
    } 
} 
0

移動的onClickListener

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

外面這些行因爲每當你點擊該按鈕的ArrayList再次初始化。

相關問題