Добавить элемент в listview из другого действия (он добавляет только один элемент)

#java #android #listview

#java #Android #listview

Вопрос:

У меня проблема в моем коде. Я хочу добавить элементы в listview из другого acivity onclickButton, но он добавляет только один элемент. И если я повторю его, он заменит только последний добавленный элемент. Я не могу понять, в чем проблема, пожалуйста, помогите.

мой код: MainActivity:

 package com.example.nasreddine.mtodubled; // project package

import android.app.AlertDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity; //imports statements
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; 
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import android.content.DialogInterface;

public class MainActivity extends AppCompatActivity {
AlertDialog.Builder alert;
public ArrayList<City> listItems;
ArrayAdapter adapter;
ListView cityListView;

@Override
protected void onCreate(Bundle savedInstanceState) { //onCreate State
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listItems=new ArrayList<>();
    adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,listItems);

        //Displaying Data on ListView
    cityListView=(ListView)findViewById(R.id.cityListView);
    cityListView.setAdapter(adapter);
    registerForContextMenu(cityListView);
    listItems.add(new City("a","b","","","","",""));
    listItems.add(new City("v","c","","","","",""));
    updateListView();
    cityListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        }
    });
    cityListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
            AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
            alert.setTitle("Delete Item from list");
            alert.setMessage("Are you sure you want to delete?");
            alert.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    listItems.remove(position);
                    adapter.notifyDataSetChanged();
                }
            });
            alert.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            alert.show();
            return true;
        }
    });
}
public void updateListView() {
    Bundle bundle = getIntent().getExtras();
    Intent intent=getIntent();
    if (bundle != null) {
        City a=new City(intent.getStringExtra("city"),intent.getStringExtra("country"),"/","/","/","/","/");
        //listItems.add(a);
        adapter.add(a);
        adapter.notifyDataSetChanged();
    }
}
public boolean onOptionsItemSelected(MenuItem item){
    if (item.getItemId()==R.id.action_add){

        Intent intent=new Intent(MainActivity.this,AddCity.class);
        startActivity(intent);
        return (true);
    }
    return (super.onOptionsItemSelected(item));
}
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main,menu);
    return super.onCreateOptionsMenu(menu);
}
}
 

AddCity.java

 package com.example.nasreddine.mtodubled;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class AddCity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_city);

    Button addButton=(Button)findViewById(R.id.addButton);
    final TextView cityAddText=(TextView)findViewById(R.id.cityAddText);
    final TextView countryAddText=(TextView)findViewById(R.id.countryAddText);

    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String city= cityAddText.getText().toString();
            String country=countryAddText.getText().toString();
            Intent intent =new Intent(AddCity.this,MainActivity.class);
            intent.putExtra("city",city);
            intent.putExtra("country",country);
            startActivity(intent);
        }
    });
}
}
 

Комментарии:

1. Можете ли вы сузить ту часть вашего кода, которая является проблемой, вместо публикации большого двоичного объекта?

Ответ №1:

В вашем MainActivity.class начните с AddCity.class использование startActivityForResult().

 public boolean onOptionsItemSelected(MenuItem item){
if (item.getItemId()==R.id.action_add){

    Intent intent=new Intent(MainActivity.this,AddCity.class);
    startActivityForResult(intent, requestCode); //ex: requestCode = 1
    return (true);

}
return (super.onOptionsItemSelected(item));
}
 

После этого в AddCity изменить добавить кнопку нажмите код прослушивателя с ниже:

 addButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        String city= cityAddText.getText().toString();
        String country=countryAddText.getText().toString();
        Intent intent =new Intent();
        intent.putExtra("city",city);
        intent.putExtra("country",country);
        setResult(RESULT_OK, intent);
        finish();
    }
});
 

После этого в onActivityResult() MainActivity получает данные и добавляет их в список. Также удалите метод updatListView() из MainActivity.

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    getActivity().invalidateOptionsMenu();
    if (resultCode == Activity.RESULT_OK) {

        if (data != null) {
            City a=new City(data.getStringExtra("city"),data.getStringExtra("country"),"/","/","/","/","/");
            listItems.add(a);
            adapter.add(a);
            adapter.notifyDataSetChanged();
            }

        }

    }

}
 

Ответ №2:

Вы перезапускаете MainActivity из действия AddCity.

Вместо этого вам нужно запустить AddCity Activity, используя метод startActivityForResult() .

И в AddCity Activity вместо запуска нового MainActivity вам нужно использовать метод SetResult() для отправки данных в предыдущее действие.

Также вам необходимо переопределить метод onActivityResult в классе MainActivity, чтобы получить ответ от AddCity Activity.

Приветствия!!!

Комментарии:

1. можете ли вы привести пример, пожалуйста, потому что я новичок в Android

Ответ №3:

Вот код:

Основное действие класса,

 import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
{
    AlertDialog.Builder alert;
    public List<City> listItems;
    ArrayAdapter<City> adapter;
    ListView cityListView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    { //onCreate State
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listItems = new ArrayList<>();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listItems);

        //Displaying Data on ListView
        Button addButton = (Button) findViewById(R.id.addButton);
        addButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                startActivityForResult(new Intent(MainActivity.this, AddCity.class), 1);
            }
        });

        cityListView = (ListView) findViewById(R.id.cityListView);
        cityListView.setAdapter(adapter);
        registerForContextMenu(cityListView);
        listItems.add(new City("a", "b"));
        listItems.add(new City("v", "c"));
        updateListView();
    }

    public void updateListView()
    {
        Bundle bundle = getIntent().getExtras();
        Intent intent = getIntent();
        if(bundle != null)
        {
            City a = new City(intent.getStringExtra("city"), intent.getStringExtra("country"));
            //listItems.add(a);
            adapter.add(a);
            adapter.notifyDataSetChanged();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        super.onActivityResult(requestCode, resultCode, intent);

        if(requestCode == 1 amp;amp; resultCode == RESULT_OK)
        {
            City a = new City(intent.getStringExtra("city"), intent.getStringExtra("country"));
            //listItems.add(a);
            adapter.add(a);
            adapter.notifyDataSetChanged();
        }
    }
}
 

Класс Добавить город,

 import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class AddCity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_city);

        Button addButton = (Button) findViewById(R.id.addButton);
        final TextView cityAddText = (TextView) findViewById(R.id.cityAddText);
        final TextView countryAddText = (TextView) findViewById(R.id.countryAddText);

        addButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                String city = cityAddText.getText().toString();
                String country = countryAddText.getText().toString();

                Intent intent = new Intent();
                intent.putExtra("city", city);
                intent.putExtra("country", country);

                setResult(RESULT_OK, intent);
            }
        });
    }
}
 

Надеюсь, это вам поможет.

Приветствия!!!