Reputation: 374
So I have created a simple app that let's the user add an item (image, name and age) and when submit button is clicked, the items will be shown in the MainActivity through a recyclerView.
The problem with my code below is that when I hit the save button, my app will close.
Have a look at my code below:
MainActivity.java
public class MainActivity extends AppCompatActivity {
Uri imageUri;
ArrayList<Person> personArrayList = new ArrayList<>();
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private CoordinatorLayout coordinatorLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//
mRecyclerView = findViewById(R.id.recyclerview);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mAdapter = new PersonAdapter(personArrayList);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
//
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mAdapter = new PersonAdapter(personArrayList);
mAdapter.notifyDataSetChanged();
mRecyclerView.setAdapter(mAdapter);
}
//for menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.add_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case R.id.action_add:
Intent add = new Intent(MainActivity.this, AddPersonActivity.class);
startActivityForResult(add, 0);
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Bundle bundle = data.getExtras();
imageUri = bundle.getParcelable("image");
String name = bundle.getString("name");
String age = bundle.getString("age");
Person person = new Person(imageUri, name, age);
//
switch (requestCode){
case 0: //request to add new person
personArrayList.add(person);
Snackbar snackbar = Snackbar
.make(coordinatorLayout, "New person added.", Snackbar.LENGTH_INDEFINITE)
.setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar snackbar1 = Snackbar
.make(coordinatorLayout, "Undo successful.", Snackbar.LENGTH_SHORT);
snackbar1.show();
}
})
.setActionTextColor(Color.RED);
snackbar.show();
break;
}
}else{
}
}
}
AddPersonActivity.java
public class AddPersonActivity extends AppCompatActivity implements View.OnClickListener {
Uri imageUri;
ImageView personiv;
EditText person_name, person_age;
Button btnsave, btncancel;
PersonAdapter adapter;
private static final int PICK_IMAGE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_person);
//instantiate
personiv = (ImageView) findViewById(R.id.imageview2);
person_name = (EditText) findViewById(R.id.edittextname);
person_age = (EditText) findViewById(R.id.edittextage);
btnsave = (Button) findViewById(R.id.btnsave);
btncancel = (Button) findViewById(R.id.btncancel);
personiv.setOnClickListener(this);
btnsave.setOnClickListener(this);
btncancel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int sid = v.getId();
switch (sid){
case R.id.imageview2:
Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(gallery, PICK_IMAGE);
break;
case R.id.btnsave:
String name = person_name.getText().toString();
String age = person_age.getText().toString();
if(!name.equals("") && !age.equals("")){
Intent intent = new Intent(); //blind intent
intent.putExtra("image", this.imageUri);
intent.putExtra("name", name);
intent.putExtra("age", age);
this.setResult(Activity.RESULT_OK, intent);
finish();
}else{
Toast.makeText(getApplicationContext(), "Fill in all fields!", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btncancel:
personiv.setImageResource(R.drawable.add_user);
person_name.setText("");
person_age.setText("");
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode != 0){
if(data != null){
imageUri = data.getData();
personiv.setImageURI(imageUri);
}//end if
}else{
/////
}
}
}
PersonAdapter.java
public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.PersonViewHolder> {
private ArrayList<Person> mpersonArrayList;
public static class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public ImageView mImage;
public TextView mName, mAge;
LinearLayout customlayout;
public PersonViewHolder(@NonNull View itemView) {
super(itemView);
mImage = (ImageView) itemView.findViewById(R.id.imageview1);
mName = (TextView) itemView.findViewById(R.id.textname);
mAge = (TextView) itemView.findViewById(R.id.textage);
}
@Override
public void onClick(View v) {
}
}
public PersonAdapter(ArrayList<Person> personArrayList){
mpersonArrayList = personArrayList;
}
@NonNull
@Override
public PersonViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.custom_layout, viewGroup, false);
PersonViewHolder pvholder = new PersonViewHolder(view);
return pvholder;
}
@Override
public void onBindViewHolder(@NonNull PersonViewHolder personViewHolder, int i) {
Person currentItem = mpersonArrayList.get(i);
personViewHolder.mImage.setImageURI(currentItem.getmImage());
personViewHolder.mName.setText(currentItem.getmName());
personViewHolder.mAge.setText(currentItem.getmAge());
}
@Override
public int getItemCount() {
return mpersonArrayList.size();
}
}
Person.java
public class Person {
private Uri mImage;
private String mName, mAge;
//constructor
public Person(Uri mImage, String mName, String mAge) {
this.mImage = mImage;
this.mName = mName;
this.mAge = mAge;
}
//getters and setters
public Uri getmImage() {
return mImage;
}
public void setmImage(Uri mImage) {
this.mImage = mImage;
}
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public String getmAge() {
return mAge;
}
public void setmAge(String mAge) {
this.mAge = mAge;
}
}
Logcat
2019-07-21 16:06:59.623 4287-4287/com.example.recyclerviewobject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.recyclerviewobject, PID: 4287
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { (has extras) }} to activity {com.example.recyclerviewobject/com.example.recyclerviewobject.MainActivity}: java.lang.IllegalArgumentException: No suitable parent found from the given view. Please provide a valid view.
at android.app.ActivityThread.deliverResults(ActivityThread.java:4932)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4975)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1950)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Caused by: java.lang.IllegalArgumentException: No suitable parent found from the given view. Please provide a valid view.
at android.support.design.widget.Snackbar.make(Snackbar.java:181)
at com.example.recyclerviewobject.MainActivity.onActivityResult(MainActivity.java:91)
at android.app.Activity.dispatchActivityResult(Activity.java:7690)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4928)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4975)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1950)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Upvotes: 0
Views: 34
Reputation: 8191
try deleting this :
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mAdapter = new PersonAdapter(personArrayList);
mAdapter.notifyDataSetChanged();
mRecyclerView.setAdapter(mAdapter);
also
private CoordinatorLayout coordinatorLayout;
is never initialized with findViewById();
and then your snackbar
code is probably failing, because the layout you are passing (coordinatorLayout
) is null
Upvotes: 1