我的代码所做的是添加,删除和编辑操作。单击添加按钮,名称将添加到列表中,删除时,特定行将被删除。同样,单击编辑按钮时,将提示一个对话框必须执行哪个编辑操作然后单击保存,编辑的数据应该在该特定行中更新。
我面临的问题是单击保存按钮,应用程序崩溃了。
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();
请提前帮助我,Thanx。
答案 0 :(得分:1)
请按照以下更新您的适配器
public class UserCustomAdapter extends ArrayAdapter<User> {
Context context;
int layoutResourceId;
UserCustomAdapter userAdapter;
ArrayList<User> data;//<--------changed
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;
userAdapter = this;//<--------changed
}
@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();
data.get(position).setName(srt);//<--------changed
notifyDataSetChanged();//<--------changed
}
});
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;}}
答案 1 :(得分:0)
我认为你得到空指针异常..
public class UserCustomAdapter extends ArrayAdapter<User> {
Context context;
int layoutResourceId;
UserCustomAdapter userAdapter; // b'coz of this line
它是未初始化的/ null变量。
答案 2 :(得分:0)
我认为关于NullPointerException的sourabh禁令是正确的。试试这个:
public UserCustomAdapter(Context context, int layoutResourceId,
ArrayList<User> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
// add this line
userAdapter = this;
}
答案 3 :(得分:0)
尝试更改
LayoutInflater
@Override
public View getView(final int position, View convertView, ViewGroup parent){
View row = convertView;
UserHolder holder = null;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.item_menu, null);
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());