Adding an ArrayAdapter from an Activity AlertDialog to a Fragment

I am learning a prototype in Android Studio and I have reached the latch for which I cannot find the answers.

I have an Activity that displays a custom ArrayAdapter as a ListView. I can edit items in a ListView by clicking on them and typing in the resulting AlertDialog. There is also an add button that I can click, and it calls a similar AlertDialog, but when I am, saving is not added to the ListView. How to get AlertDialog text input to save as a new ArrayAdapter element?

Most of the examples I found created an instance of ArrayAdapter directly in Activity, and not through Fragment, as I did.

MainActivity.java

public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { //initialize the activity super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //establish where the layout will come from Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //creates a toolbar setSupportActionBar(toolbar); if (findViewById(R.id.fragment_container) != null) { if (savedInstanceState != null) { return; } //creates the first fragment dynamically, so it can be replaced Fragment firstFragment = new MainActivityFragment(); firstFragment.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, firstFragment).commit(); } //This creates the Floating Action Button FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { createDialog(); } private void createDialog() { ArrayList<User> users = new ArrayList<User>(); // create an AlertDialog that'll come up when the add button is clicked AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); // set title alertDialog.setTitle("Add item"); final EditText input = new EditText(MainActivity.this); //uses the EditText from dialog_set input.setInputType(InputType.TYPE_CLASS_TEXT); //makes the dialog ask for plain text input alertDialog.setView(input); // set up buttons alertDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String textInput = input.getText().toString(); //saves user text as a string Log.d(TAG, textInput); // records input as a log CustomUsersAdapter.this.add(textInput); } }); alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // show it alertDialog.show(); } }); } 

MainActivityFragment.java

 public class MainActivityFragment extends Fragment { @BindView(R.id.lvUsers) ListView listView; public MainActivityFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, container, false); ButterKnife.bind(this, view); ArrayList<User> arrayOfUsers = new ArrayList<User>(); arrayOfUsers.add(new User("Person 1", "Hometown 1")); arrayOfUsers.add(new User("Person 2", "Hometown 2")); arrayOfUsers.add(new User("Person 3", "Hometown 3")); arrayOfUsers.add(new User("Person 4", "Hometown 4")); arrayOfUsers.add(new User("Person 5", "Hometown 5")); // Create the adapter to convert the array to views CustomUsersAdapter adapter = new CustomUsersAdapter(getContext(), arrayOfUsers); // Attach the adapter to a ListView listView.setAdapter(adapter); return view; } 

CustomUsersAdapter.java

 public class CustomUsersAdapter extends ArrayAdapter<User> { private ArrayList<User> users; public CustomUsersAdapter(Context context, ArrayList<User> users) { super(context, 0, users); this.users = users; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // Get the data item for this position User user = getItem(position); // Check if an existing view is being reused, otherwise inflate the view if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, parent, false); } // Lookup view for data population TextView tvName = (TextView) convertView.findViewById(R.id.tvName); TextView tvHome = (TextView) convertView.findViewById(R.id.tvHometown); // Populate the data into the template view using the data object tvName.setText(user.name); tvHome.setText(user.hometown); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { createDialog(position); } }); // Return the completed view to render on screen return convertView; } protected void add(String textInput) { add(new User(textInput, "Incomplete")); } private void createDialog(final int position) { // create an AlertDialog that'll come up when text is clicked AlertDialog.Builder alertDialog = new AlertDialog.Builder( getContext()); // set title alertDialog.setTitle("Edit item"); final EditText input = new EditText(getContext()); //uses the EditText from dialog_set input.setInputType(InputType.TYPE_CLASS_TEXT); //makes the dialog ask for plain text input alertDialog.setView(input); // set up buttons alertDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String textInput = input.getText().toString(); //saves user text as a string users.get(position).name = textInput; notifyDataSetChanged(); } }); alertDialog.setNeutralButton("Complete", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { users.get(position).hometown = "Complete"; notifyDataSetChanged(); } }); alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // show it alertDialog.show(); } 

ListView layout (from main_xml fragment)

 <ListView android:id="@+id/lvUsers" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" > </ListView> 
+5
source share
1 answer

There are several problems that you have. Firstly, you are trying to update your adapter using a static call, but you cannot do this. You also need to configure your add method. It should look something like this:

 protected void add(String textInput) { this.users.add(new User(textInput, "Incomplete")); } 

This is only part of the problem. You need to pass the link to the object in onClickListener . You are trying to make a static call. This will not work. I might consider putting a Floating Action button. If you have done this, you can easily pass the link to the adapter:

 public class MainActivityFragment extends Fragment { private final CustomUsersAdapter adapter; @BindView(R.id.lvUsers) ListView listView; public MainActivityFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, container, false); ButterKnife.bind(this, view); ArrayList<User> arrayOfUsers = new ArrayList<User>(); arrayOfUsers.add(new User("Person 1", "Hometown 1")); arrayOfUsers.add(new User("Person 2", "Hometown 2")); arrayOfUsers.add(new User("Person 3", "Hometown 3")); arrayOfUsers.add(new User("Person 4", "Hometown 4")); arrayOfUsers.add(new User("Person 5", "Hometown 5")); // Create the adapter to convert the array to views adapter = new CustomUsersAdapter(getContext(), arrayOfUsers); // Attach the adapter to a ListView listView.setAdapter(adapter); return view; } //This creates the Floating Action Button FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { createDialog(); } private void createDialog() { ArrayList<User> users = new ArrayList<User>(); // create an AlertDialog that'll come up when the add button is clicked AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); // set title alertDialog.setTitle("Add item"); final EditText input = new EditText(MainActivity.this); //uses the EditText from dialog_set input.setInputType(InputType.TYPE_CLASS_TEXT); //makes the dialog ask for plain text input alertDialog.setView(input); // set up buttons alertDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String textInput = input.getText().toString(); //saves user text as a string Log.d(TAG, textInput); // records input as a log adapter.add(textInput); } }); alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // show it alertDialog.show(); } }); 

By doing something like this, you can pass the adapter link to the inner class that you created, and then update. Hope this helps.

0
source

Source: https://habr.com/ru/post/1259877/


All Articles