我的代碼的作用是添加,刪除和編輯操作。點擊添加按鈕名稱被添加到列表中,並刪除特定的行被刪除。類似地,單擊編輯按鈕時將會提示一個對話框,其中必須執行編輯操作,然後單擊保存,編輯的數據應在該特定行中更新。如何保存在列表視圖中對行進行的更改?
我面臨的問題是點擊保存按鈕時,應用程序崩潰。
MainActivity.java
public class MainActivity extends AppCompatActivity
{
ListView userList;
UserCustomAdapter userAdapter;
Button addButton;
ArrayList<User> userArray = new ArrayList<User>();
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* add item in arraylist
*/
userArray.add(new User("a"));
userArray.add(new User("b"));
userArray.add(new User("c"));
userArray.add(new User("d"));
userArray.add(new User("e"));
userArray.add(new User("f"));
userArray.add(new User("g"));
final Button addButton = (Button)findViewById(R.id.add_button);
editText = (EditText) findViewById(R.id.edit_data);
/**
* set item into adapter
*/
userAdapter = new UserCustomAdapter(MainActivity.this, R.layout.list_view_layout,
userArray);
userList = (ListView) findViewById(R.id.listView);
userList.setItemsCanFocus(false);
userList.setAdapter(userAdapter);
/**
* on click of add button(add data to arraylist)
*/
addButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
userArray.add(new User(editText.getText().toString()));
userAdapter.notifyDataSetChanged();
}
});
/**
* get on item click listener
*/
userList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
final int position, long id) {
Toast.makeText(MainActivity.this,
"Name Clicked:" +position, Toast.LENGTH_LONG)
.show();
}
});}}
UserCustomAdapter.java
public class UserCustomAdapter extends ArrayAdapter<User> {
Context context;
int layoutResourceId;
UserCustomAdapter userAdapter;
ArrayList<User> data = new ArrayList<User>();
ArrayList<User> userArray = new ArrayList<User>();
public UserCustomAdapter(Context context, int layoutResourceId,
ArrayList<User> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
UserHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new UserHolder();
holder.addButton =(Button) row.findViewById(R.id.add_button);
holder.textName = (TextView) row.findViewById(R.id.textView_name);
holder.btnEdit = (Button) row.findViewById(R.id.button_edit);
holder.btnDelete = (Button) row.findViewById(R.id.button_delete);
row.setTag(holder);
} else {
holder = (UserHolder) row.getTag();
}
User user = data.get(position);
holder.textName.setText(user.getName());
/**
* prompt dialog on click of edit button
*/
holder.btnEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
alertDialog.setTitle("EDIT NAME");
alertDialog.setMessage("Enter Name");
final EditText input = new EditText(context);
alertDialog.setView(input);
alertDialog.setPositiveButton("SAVE", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String srt = input.getEditableText().toString();
Toast.makeText(context,srt, Toast.LENGTH_LONG).show();
userAdapter.notifyDataSetChanged();
}
});
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
AlertDialog alert = alertDialog.create();
alert.show();
}
});
/**
* Delete's a name from the list
*/
holder.btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Delete Button Clicked", "**********");
Toast.makeText(context, "Delete button Clicked",
Toast.LENGTH_LONG).show();
data.remove(position); //or some other task
notifyDataSetChanged();
}
});
return row;
}
static class UserHolder {
TextView textName;
Button btnEdit;
Button btnDelete;
Button addButton;}}
誤差是在userAdapter.notifyDataSetChanged();
plz幫助我,Thanx提前。
請也張貼logcat的... – Hearty
能你請添加stacktrace? 哪一行導致您的應用程序崩潰? – FrenchFalcon
你應該調用userAdapter.notifyDataSetChanged();在你的活動onResume。當您在警報對話框中調用notifyDataSetChanged時,實際活動未處於活動狀態或處於暫停狀態 – drulabs