2016-04-28 6 views
1

Was mein Code tut ist hinzufügen, löschen und bearbeiten Operationen.Nach Klicken auf Hinzufügen Schaltfläche wird der Name hinzugefügt, um die Liste und beim Löschen der bestimmten Zeile wird gelöscht.Auf ähnliche Weise, beim Klicken auf Bearbeiten Schaltfläche wird ein Dialogfeld aufgefordert, in dem Der Bearbeitungsvorgang muss ausgeführt werden, und beim Klicken auf Speichern müssen die bearbeiteten Daten in dieser bestimmten Zeile aktualisiert werden.Wie speichern Sie die Änderungen an der Zeile in der Listenansicht?

Problem, das ich konfrontiert ist, ist beim Klicken auf Speichern Schaltfläche die App wird abgestürzt.

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

Fehler bei userAdapter.notifyDataSetChanged();

Bitte helfen Sie mir, Danke im Voraus.

+0

Bitte senden Sie auch die LogCat ... – Hearty

+0

Kann fügst du bitte den stacktrace hinzu? In welcher Zeile stürzt Ihre App ab? – FrenchFalcon

+0

sollten Sie userAdapter.notifyDataSetChanged() aufrufen; in onResume Ihrer Aktivität. Wenn Sie notifyDataSetChanged im Warnungsdialog aufrufen, ist die aktuelle Aktivität nicht aktiv oder befindet sich im angehaltenen Zustand. – drulabs

Antwort

1

Bitte aktualisieren Sie Ihren Adapter wie unten

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

Ich glaube, du Null-Zeiger Ausnahme bekommen ..

es nicht initialisierten/null variabel ist.

0

Ich denke, dass Sourabh Bans bezüglich der NullPointerException richtig ist. Versuchen Sie folgendes:

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; 

} 
+0

yup funktioniert jetzt einwandfrei. Die Daten werden jedoch nicht geändert – learner

+1

da Sie die Daten nicht zurück zur Liste setzen. –

0

Versuchen Änderung

LayoutInflater 

in getView

@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()); 
Verwandte Themen