Android 在添加第二项后,Listview仅显示一项
为什么我的自定义listview只显示在EditText中键入的最新数据(listview中只有一行),方法是单击该窗口中的“添加”按钮,它应该右键追加到listview项的下一行,并将数据保存并读取到.dat文件中。有人能帮我写下面的代码吗 这是我的主要活动代码:Android 在添加第二项后,Listview仅显示一项,android,listview,arraylist,custom-adapter,Android,Listview,Arraylist,Custom Adapter,为什么我的自定义listview只显示在EditText中键入的最新数据(listview中只有一行),方法是单击该窗口中的“添加”按钮,它应该右键追加到listview项的下一行,并将数据保存并读取到.dat文件中。有人能帮我写下面的代码吗 这是我的主要活动代码: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText edText; pri
public class MainActivity extends AppCompatActivity implements
View.OnClickListener {
private EditText edText;
private Button btnAdd;
private DatePickerDialog.OnDateSetListener dpdDateTimePicker;
private TextView tvDate;
private TextView tvListItem;
private TextView tvListDate;
private ArrayList<Items> arrItem;
private ItemListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edText = findViewById(R.id.edText);
btnAdd = findViewById(R.id.btnAdd);
tvDate = findViewById(R.id.tvDate);
tvListItem = findViewById(R.id.tvItem);
tvListDate = findViewById(R.id.tvDate);
ListView lvItemList = (ListView) findViewById(R.id.lvItem);
//Date start
tvDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(MainActivity.this,
android.R.style.Theme_Holo_Dialog_MinWidth,
dpdDateTimePicker,
year, month,day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
dpdDateTimePicker = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
month = month + 1;
String date = dayOfMonth + "/" + month + "/" + year;
tvDate.setText(date);
}
};
//Date end
//Read Data
arrItem = FileHelper.readData(this);
adapter = new ItemListAdapter(this, R.layout.adapter_view_layout, arrItem);
lvItemList.setAdapter(adapter);
btnAdd.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnAdd:
ListView lvItemList = (ListView) findViewById(R.id.lvItem);
String itementered = edText.getText().toString();
String dateentered = tvDate.getText().toString();
Items item1 = new Items(itementered, dateentered);
ArrayList<Items> ItemList = new ArrayList<>();
ItemList.add(item1);
FileHelper.writeData(ItemList, this);
adapter = new ItemListAdapter(this, R.layout.adapter_view_layout, ItemList);
lvItemList.setAdapter(adapter);
//Clear TextView and EditText
edText.setText("");
tvDate.setText("");
Toast.makeText(this,"Task Added", Toast.LENGTH_SHORT).show();
break;
}
}
}
在
onClick
函数中,始终创建一个新的ArrayList ItemList
并向其中添加单个Items
,然后创建一个新的ItemListAdapter
,在lvItemList
中显示此新的(一项)列表
代码应该更像下面的代码
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnAdd:
ListView lvItemList = (ListView) findViewById(R.id.lvItem);
String itementered = edText.getText().toString();
String dateentered = tvDate.getText().toString();
Items item1 = new Items(itementered, dateentered);
//do not create a new ArrayList
//ArrayList<Items> ItemList = new ArrayList<>();
//ItemList.add(item1);
//append item1 to the existing one instead
arrItem.add(item1);
//you might have to change this line to handle addition of single item
//FileHelper.writeData(ItemList, this);
//however after a quick look at FileHelper it seems that
FileHelper.writeData(arrItem, this); //might work
//now you also don't need to/shouldn't create a new adapter
//adapter = new ItemListAdapter(this, R.layout.adapter_view_layout, ItemList);
//lvItemList.setAdapter(adapter);
//just notify that arrItem has changed and the adapter will update the ListView
adapter.notifyDataSetChanged();
//Clear TextView and EditText
edText.setText("");
tvDate.setText("");
Toast.makeText(this,"Task Added", Toast.LENGTH_SHORT).show();
break;
}
}
这将在lvItemList
中显示arrytem
的内容。如果以后要添加项目,请将其添加到arrItem
并调用adapter.notifyDataSetChanged()
以显示更改
关于FileHelper
的说明。它看起来像是FileHelper.writeData()
重写了整个文件,因此写入arrItem
应该会产生所需的结果,其中lvItemList
中显示的所有项目也存储在该文件中
public class ItemListAdapter extends ArrayAdapter<Items> {
private Context mContext;
int mResource;
public ItemListAdapter(Context context, int resource, ArrayList<Items> objects) {
super(context, resource, objects);
this.mContext = context;
this.mResource = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//get the Item info
String task = getItem(position).getTask();
String date = getItem(position).getDate();
//Create the task object with the information
Items item = new Items(task, date);
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(mResource, parent, false);
TextView tvDate = (TextView) convertView.findViewById(R.id.tvDate);
TextView tvTask = (TextView) convertView.findViewById(R.id.tvItem);
tvDate.setText(date);
tvTask.setText(task);
return convertView;
}
}
public class Items implements Serializable {
private String task;
private String date;
public Items(String task, String date) {
this.task = task;
this.date = date;
}
public String getTask() {
return task;
}
public void setTask(String task) {
this.task = task;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnAdd:
ListView lvItemList = (ListView) findViewById(R.id.lvItem);
String itementered = edText.getText().toString();
String dateentered = tvDate.getText().toString();
Items item1 = new Items(itementered, dateentered);
//do not create a new ArrayList
//ArrayList<Items> ItemList = new ArrayList<>();
//ItemList.add(item1);
//append item1 to the existing one instead
arrItem.add(item1);
//you might have to change this line to handle addition of single item
//FileHelper.writeData(ItemList, this);
//however after a quick look at FileHelper it seems that
FileHelper.writeData(arrItem, this); //might work
//now you also don't need to/shouldn't create a new adapter
//adapter = new ItemListAdapter(this, R.layout.adapter_view_layout, ItemList);
//lvItemList.setAdapter(adapter);
//just notify that arrItem has changed and the adapter will update the ListView
adapter.notifyDataSetChanged();
//Clear TextView and EditText
edText.setText("");
tvDate.setText("");
Toast.makeText(this,"Task Added", Toast.LENGTH_SHORT).show();
break;
}
}
adapter = new ItemListAdapter(this, R.layout.adapter_view_layout, arrItem);
lvItemList.setAdapter(adapter);