如何保存列表视图中对行所做的更改?

时间:2016-04-28 07:24:56

标签: android

我的代码所做的是添加,删除和编辑操作。单击添加按钮,名称将添加到列表中,删除时,特定行将被删除。同样,单击编辑按钮时,将提示一个对话框必须执行哪个编辑操作然后单击保存,编辑的数据应该在该特定行中更新。

我面临的问题是单击保存按钮,应用程序崩溃了。

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。

4 个答案:

答案 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());