2016-04-28 19 views
1

我的代碼的作用是添加,刪除和編輯操作。點擊添加按鈕名稱被添加到列表中,並刪除特定的行被刪除。類似地,單擊編輯按鈕時將會提示一個對話框,其中必須執行編輯操作,然後單擊保存,編輯的數據應在該特定行中更新。如何保存在列表視圖中對行進行的更改?

我面臨的問題是點擊保存按鈕時,應用程序崩潰。

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提前。

+0

請也張貼logcat的... – Hearty

+0

能你請添加stacktrace? 哪一行導致您的應用程序崩潰? – FrenchFalcon

+0

你應該調用userAdapter.notifyDataSetChanged();在你的活動onResume。當您在警報對話框中調用notifyDataSetChanged時,實際活動未處於活動狀態或處於暫停狀態 – drulabs

回答

1

請getView更新您的適配器如下

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

我覺得你越來越空指針異常..

尚未初始化/ null的變量。

0

我認爲sourabh禁令是正確的關於NullPointerException。試試這個:

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它的工作正常。但數據未發生變化 – learner

+1

因爲您沒有將數據設置回列表。 –

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()); 
相關問題