Search code examples
androidlistviewbaseadapter

New row is not adding in ListView Android


My app Add item (i.e Name,age and person image) to List view. But whenever i click on add, it replaces the old listView and no new row is added. Main Activity

public class MainActivity extends AppCompatActivity {

private AlertDialog.Builder builder;
private Uri uri;
private CustomAdapter customAdapter;
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = (ListView) findViewById(R.id.listView);
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu,menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()==R.id.menuItem)
    {
        builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Add to List.");
        builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setView(R.layout.alert_dialog);
        builder.setCancelable(false);
        builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if(uri != null) {

                    EditText nameText = (EditText) ((AlertDialog) dialogInterface).findViewById(R.id.name);
                    EditText ageText = (EditText) ((AlertDialog) dialogInterface).findViewById(R.id.age);
                    customAdapter = new CustomAdapter(getApplicationContext(), nameText.getText().toString(), ageText.getText().toString(), uri);
                    listView.setAdapter(customAdapter);


                }
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.cancel();
            }
        });

        Dialog dialog = builder.create();
        dialog.show();
    }
    return super.onOptionsItemSelected(item);
}


public void imagePicker(View v) {

    Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    i.setType("image/*");
    i.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(i, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK && data != null){
        uri = data.getData();

    }
}}

All i need is this, when i press Add it should add new row in listView.


Solution

  • What you should implement is notifyDataSetChanged The same can be done as follow : Create a custom POJO, UserInfo

    public Class UserInfo{
    private String name;
    private String age;
    private Uri uri;
    
    public UserInfo(String name, String age, Uri uri) {
        this.name = name;
        this.age = age;
        this.uri = uri;
    }
    

    }

    • Declare a list of UserInfo

      private List<UserInfo> userList= new ArrayList<>();

    • Add following lines in onCreate method.

      customAdapter = new CustomAdapter(getApplicationContext(), userList); listView.setAdapter(customAdapter);

    • Change onCLickMethod of dialog by following :

    `

    if(uri!=null){
    EditText nameText = (EditText) ((AlertDialog) dialogInterface).findViewById(R.id.name);
    EditText ageText = (EditText) ((AlertDialog) dialogInterface).findViewById(R.id.age);
    userList.add(new 
      UserInfo(nameText.getText().toString(),ageText.getText().toString(),uri));
    customAdapter.swapData(userList);
    }
    

    `

    • Modify your CustomAdapter

      List<UserInfo> userList;

      public CustomAdapter(Context context,List<UserInfo> userList){ this.context = context; this.userList = userList; this.inflater = LayoutInflater.from(context); }

      `@Override
      public int getCount() {
        if(userList!=null){
           return userList.size();
        }else{
          return 1;
        }
      }
      

      public void swapData(List<UserInfo> userList) { this.userList = userList; notifyDataSetChanged(); }

    Hope this helps, Revert if any problem.