Android, как обновить содержимое ListView из внешней активности?

У меня есть проект с 4 классами: 2 действия, 1 адаптер и 1 класс для простого объекта. Имена классов: Основная деятельность, AddingItemsActivity, ItemAdapter, SimpleItem. В макете, соответствующем Основная деятельность, есть представление списка с именем SimpleListView. SimpleListView должен содержать объекты SimpleItem. ItemAdapter создан для обработки SimpleListView. Обновление, добавление элементов в SimpleListView из Основная деятельность очень просто. Я хотел бы достичь обновления, добавления элементов, которые появляются в SimpleListView, из AddingItemsActivity (появляются, когда пользователь возвращается в Основная деятельность). Не могли бы вы сказать мне, что мне делать, чтобы этого достичь?

PS: Хотелось бы спросить: "как обновить SimpleListView от AddingItemsActivity?" но я прочитал, что это неправильный вопрос, потому что SimpleListView не существует в AddingItemsActivity.

Основная деятельность

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button toAddingActivity = findViewById(R.id.toAddingActivitybutton);
        final ListView simpleItemsListView = findViewById(R.id.SimpleListView);
        final ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter);


        toAddingActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getBaseContext(), AddingItemsActivity.class);
                startActivity(intent);
            }
        });    
    }
} 

AddingItemsActivity

public class AddingItemsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adding_items);
        Button addItem = findViewById(R.id.AddItembutton);
//        final ListView simpleItemsListView = findViewById(R.id.SimpleListView);
//        final ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter);



        addItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                first reflex try, which does not work:

//                SimpleItem item = new SimpleItem("String number 1", "String number 2");
//                mAdapter.add(item);
//                simpleItemsListView.setAdapter(mAdapter);
            }
        });
    }
}

ItemAdapter

public class ItemAdapter extends ArrayAdapter<SimpleItem>{
    public  ItemAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }
    public ItemAdapter(Context context, int resource, List<SimpleItem> items) {
        super(context, resource, items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v = vi.inflate(R.layout.simple_item_adapter, null);
        }

        SimpleItem  item = getItem(position);

        if (item != null) {
            TextView tv1 = v.findViewById(R.id.adapterTextView1);
            TextView tv2 = v.findViewById(R.id.adapterTextView2);

            tv1.setText(item.getStr1());
            tv2.setText(item.getStr2());
        }
        return v;
    }
}

SimpleItem

public class SimpleItem {
    private String str1;
    private String str2;


    public SimpleItem(String s1, String s2)
    {
        str1 = s1;
        str2 = s2;
    }

    public String getStr1()
    {
        return str1;
    }


    public String getStr2()
    {
        return str2;
    }


}

Вы можете startActivityForResult из действия простых элементов, а затем, после добавления элементов в действие добавления элементов, установить результат с новым элементом и снова в активности списка элементов, получить новый элемент в onActivityResult и добавить элемент в адаптер списка

Sony 14.03.2018 21:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
80
3

Ответы 3

  1. Используйте startActivityForResult, чтобы получить результат как SimpleItem из AddingItemsActivity.

    Intent intent = new Intent(getBaseContext(), AddingItemsActivity.class); startActivityForResult(intent,1);

  2. Создайте SimpleItem в AddingItemsActivity, добавьте к нему значения и используйте setResult, чтобы вернуть простой экземпляр элемента в MainActivity.

    // inside on click
    SimpleItem item = new SimpleItem("String number 1", "String number 2");
    Intent returnIntent = new Intent();
    returnIntent.putExtra("result", item);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();`
    
  3. В MainActivity

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK){
            SimpleItem result = (SimpleItem)data.getSerializableExtra("result");
            // add result to the list, used by adapter
            // notify adapter using notifyDataSetChanged
        }
    }
    }//onActivityResult
    

Примечание: добавьте public class SimpleItem implements Serializable и, похоже, вы забыли создать и передать список экземплярам адаптера, поэтому просто создайте его.

Я где-то заблудился. В вашем пункте 3 в SimpleItem result=data.getSerializable("result"); я получил выделенный красным цветом getSerializable с Cannot resolve method 'getSerializable(java.lang.String). Я предполагаю, что приложение выбирает метод из неправильного класса. Не могли бы вы сказать мне, как мне это преодолеть?

Czarek 14.03.2018 22:10

Я забыл кастинг как SimpleItem result= (SimpleItem )data.getSerializable("result"); и не забыл public class SimpleItem implements Serializable

Pavneet_Singh 15.03.2018 15:06

Я все еще получаю Cannot resolve method 'getSerializable(java.lang.String)'

Czarek 15.03.2018 16:01

о боже мой должен быть getSerializableExtra

Pavneet_Singh 15.03.2018 16:03

Не могли бы вы мне сказать, где именно нужно создать экземпляр адаптера, в каком методе MainActivity или вне его методов? А где именно должна появиться строка simpleItemsListView.setAdapter(adapterName);?

Czarek 15.03.2018 16:18

Должен ли onActivityResult в итоге выглядеть следующим образом? @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if (resultCode == Activity.RESULT_OK){ SimpleItem result = (SimpleItem)data.getSerializableExtra("result"); // add result to the list, used by adapter // notify adapter using notifyDataSetChanged adapterName.add(result); adapterName.notifyDataSetChanged(); } } }

Czarek 15.03.2018 16:20
dapter instance should be created объявляет его снаружи oncreate и инициализирует его внутри oncreate, а затем устанавливает его в listview и да
Pavneet_Singh 15.03.2018 16:21

ваш adaper не завершен, вы должны переопределить метод getCount и установить для него свой list.size (). затем из MainActivity вы создаете список простых элементов и передаете его своему адаптеру.

ArrayList<SimpleItem> items=new ArrayList<>();
final ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter,items);

затем вы можете поместить свой список в намерение и передать его в AddingItemsActivity.

Intent intent=new Intent (this,AddingItemsActivity.class);
intent.putExtra("Key",items);
startActivityForResult(intent,your request code (exam : 14));

и в AddingItemsActivity:

Bundle bundel=getIntent().getExtras();
ArrayList<SimpleItem> items=(ArrayList<SimpleItem>)bundle.get("Key");

изменить или добавить элементы в список и вернуть его в MainActivity:

Intent returnIntent = new Intent();
returnIntent.putExtra("returnedList", item);
setResult(Activity.RESULT_OK,returnIntent);
finish();

и в onActivityResult из MainActivity:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 14) {
    if (resultCode == Activity.RESULT_OK){
       // ArrayList<SimpleItem> items=(ArrayList<SimpleItem>)data.getSerializableExtra("returnedList");
      items=(ArrayList<SimpleItem>)data.getSerializableExtra("returnedList");
            mAdapter .notifyDataSetChanged();
        }
    }
    }

И не забывайте, реализует ваш класс simpleItem Serializable

В intent.put("Key",items); я получил Cannot resolve method 'put(java.lang.String, java.util.ArrayList<com.example.user.applicationfortesting.S‌​impleItem>). В ArrayList<SimpleItem> items= (Arraylist)bundle.get("Key"); у меня Cannot resolve symbol 'Arraylist' и Cannot resolve symbol 'bundle'

Czarek 14.03.2018 22:38

не копируйте и не прошлое! вы должны импортировать необходимые классы. я отредактировал свой ответ

mostafa3dmax 14.03.2018 22:40

Хорошо, я вижу, что в вашем ответе есть несколько опечаток, например, bundel, а затем bundle, Arraylist вместо ArrayList. В Intent intent=new Intent (this,AddingItemsActivity.class); не должно быть getBaseContext() вместо this? Ведь приложение останавливается после нажатия кнопки addItem.

Czarek 14.03.2018 22:58

об этом:> Intent intent = new Intent (this, AddingItemsActivity.class); Разве это не должно быть getBaseContext () вместо этого? Я не уверен . в чем ошибка при закрытии приложения?

mostafa3dmax 14.03.2018 23:03

Разве это не должно быть returnIntent.putExtra("returnedList", items); вместо returnIntent.putExtra("returnedList", item);? После изменения это приложение не останавливается. Но после нажатия кнопки addItem он направляется на MainActivity. SimpleListView пуст.

Czarek 14.03.2018 23:20

да извините за опечатки! Я думаю, вы не переопределяете метод getItem в своем адаптере, переопределите его и установите для него return items.get (position) и создайте частный список <SimpleItem> в корне вашего класса адаптера, назовите его items и инициализируйте его в ограничителе this.items=items и снова tes

mostafa3dmax 14.03.2018 23:32
private ArrayList<SimpleItem> items; public ItemAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public ItemAdapter(Context context, int resource, ArrayList<SimpleItem> items) { super(context, resource, items); this.items = items; } @Override public int getCount() { return items.size(); } так выглядит вершина моего класса адаптеров. Это правильно? Более того, разве не должно быть где-нибудь называться .setAdapter(...)?
Czarek 15.03.2018 00:07

+ @Override public SimpleItem getItem(int position) { return items.get(position); }

Czarek 15.03.2018 00:10

да, это кажется правильным, и да, вам нужно установить адаптер для вашего списка в mainActivity, я предлагаю вам узнать больше о пользовательских адаптерах

mostafa3dmax 15.03.2018 00:16

попробуйте это и посмотрите свой список, получите какие-либо элементы или нет: ArrayList<SimpleItem> items = new ArrayList<>(); items.add(new SinpleItem("a","b")); ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter,items); simpleItemsListView.setAdapter(mAdapter);mAdapter.notifyData‌​SetChanged() , если он не работает, ваш пользовательский адаптер неправильный, и вы должны узнать о нем больше

mostafa3dmax 15.03.2018 01:00

В какой метод проекта я должен это вставить? onActivityResult? Если это действительно так, то вставка этого кода: ListView simpleItemsListView = findViewById(R.id.SimpleListView); ArrayList<SimpleItem> items = new ArrayList<>(); items.add(new SimpleItem("a","b")); ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter,items); simpleItemsListView.setAdapter(mAdapter); mAdapter.notifyDataSetChanged(); приводит к добавлению элемента в ListView. Что-то похожее я использую в addItem.setOnClickListener

Czarek 15.03.2018 01:53

нет, в своем предыдущем комментарии я хотел протестировать ваш адаптер и, похоже, он работает. Я думаю, что ошибся в своем ответе в onActivityResult и создал новый список массивов! замените ArrayList<SimpleItem items=(ArrayList<SimpleItem>)data.getSerializableExtra("retu‌​rnedList"); на items=(ArrayList<SimpleItem>)data.getSerializableExtra("retu‌​rnedList");, он должен работать.

mostafa3dmax 15.03.2018 09:14
ArrayList<SimpleItem> items=new ArrayList<>(); находится в методе onCreate, поэтому в onActivityResult ссылка items невидима - Cannot resolve symbol 'items'
Czarek 15.03.2018 13:50
public class MainActivity extends AppCompatActivity { ArrayList<SimpleItem> items=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ...
mostafa3dmax 15.03.2018 13:52

Товар не отображается в списке. Может проблема с объектом-адаптером? В каком методе должна быть размещена эта строка final ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter,items);? Каким методом инициализировать этот адаптер?

Czarek 15.03.2018 15:45

Я имел в виду: "в каком методе должна появиться эта строка simpleItemsListView.setAdapter(mAdapter);?" как мой второй вопрос.

Czarek 15.03.2018 16:03

попробуй мой новый ответ на свою работу ты. в этом случае вы можете скопировать и вставить

mostafa3dmax 15.03.2018 16:51

попробуй это :

Основная деятельность :

public class MainActivity extends AppCompatActivity {

private ArrayList<SimpleItem> items = new ArrayList<>();
private Button toAddingActivity;
private ListView simpleItemsListView;
private ItemAdapter mAdapter;

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

    toAddingActivity = (Button) findViewById(R.id.toAddingActivitybutton);
    simpleItemsListView = (ListView) findViewById(R.id.SimpleListView);
    mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter, items);
    simpleItemsListView.setAdapter(mAdapter);
    toAddingActivity.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, AddingItemsActivity.class);
            startActivityForResult(intent, 14);
        }
    });
    mAdapter.notifyDataSetChanged();

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 14 && resultCode == Activity.RESULT_OK) {
        Bundle bundle = data.getExtras();
        SimpleItem item=(SimpleItem) bundle.get("reKey");
        items.add(item);
        mAdapter.notifyDataSetChanged();
    }
}
}

ItemAdapter:

public class ItemAdapter extends ArrayAdapter<SimpleItem>{

private ArrayList<SimpleItem> items =new ArrayList<>();
private Activity activity;
private int layoutResource;
    public ItemAdapter(@NonNull Activity act, int resource, @NonNull ArrayList<SimpleItem> data) {
        super(act, resource, data);
        items =data;
        activity=act;
        layoutResource=resource;
    }
@Override
public int getCount() {
    return items.size();
}
@Override
public SimpleItem getItem(int position) {
    return items.get(position);
}

@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    ViewHolder holder;
    View row=convertView;
    if (row==null || (row.getTag()==null)){

        LayoutInflater inflater=LayoutInflater.from(activity);
        row=inflater.inflate(layoutResource,null);
        holder=new ViewHolder();
        holder.tv1=row.findViewById(R.id.adapterTextView1);
        holder.tv2=row.findViewById(R.id.adapterTextView2);
        row.setTag(holder);
    }else {
        holder=(ViewHolder)row.getTag();
    }

    holder.simpleItem=items.get(position);
    holder.tv1.setText(holder.simpleItem.getStr1());
    holder.tv2.setText(holder.simpleItem.getStr2());

    return row;
}

class ViewHolder{
    TextView tv1;
    TextView tv2;
    SimpleItem simpleItem;
}

}

AddingItemsActivity:

public class AddingItemsActivity extends AppCompatActivity{

private Button addItem;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_adding_items);
    addItem=(Button)findViewById(R.id.AddItembutton);

    addItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            SimpleItem item = new SimpleItem("String number 1", "String number 2");
            Intent returnIntent = new Intent();
            returnIntent.putExtra("reKey",item);
            setResult(Activity.RESULT_OK,returnIntent);
            finish();
        }
    });
}

}

вы можете изменить метод AddingItemsActivity onclick

Другие вопросы по теме