У меня есть проект с 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, чтобы получить результат как SimpleItem из AddingItemsActivity.
Intent intent = new Intent(getBaseContext(), AddingItemsActivity.class);
startActivityForResult(intent,1);
Создайте 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();`
В 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). Я предполагаю, что приложение выбирает метод из неправильного класса. Не могли бы вы сказать мне, как мне это преодолеть?
Я забыл кастинг как SimpleItem result= (SimpleItem )data.getSerializable("result"); и не забыл public class SimpleItem implements Serializable
Я все еще получаю Cannot resolve method 'getSerializable(java.lang.String)'
о боже мой должен быть getSerializableExtra
Не могли бы вы мне сказать, где именно нужно создать экземпляр адаптера, в каком методе MainActivity или вне его методов? А где именно должна появиться строка simpleItemsListView.setAdapter(adapterName);?
Должен ли 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(); } } }
dapter instance should be created объявляет его снаружи oncreate и инициализирует его внутри oncreate, а затем устанавливает его в listview и да
ваш 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.SimpleItem>). В ArrayList<SimpleItem> items= (Arraylist)bundle.get("Key"); у меня Cannot resolve symbol 'Arraylist' и Cannot resolve symbol 'bundle'
не копируйте и не прошлое! вы должны импортировать необходимые классы. я отредактировал свой ответ
Хорошо, я вижу, что в вашем ответе есть несколько опечаток, например, bundel, а затем bundle, Arraylist вместо ArrayList. В Intent intent=new Intent (this,AddingItemsActivity.class); не должно быть getBaseContext() вместо this? Ведь приложение останавливается после нажатия кнопки addItem.
об этом:> Intent intent = new Intent (this, AddingItemsActivity.class); Разве это не должно быть getBaseContext () вместо этого? Я не уверен . в чем ошибка при закрытии приложения?
Разве это не должно быть returnIntent.putExtra("returnedList", items); вместо returnIntent.putExtra("returnedList", item);? После изменения это приложение не останавливается. Но после нажатия кнопки addItem он направляется на MainActivity. SimpleListView пуст.
да извините за опечатки! Я думаю, вы не переопределяете метод getItem в своем адаптере, переопределите его и установите для него return items.get (position) и создайте частный список <SimpleItem> в корне вашего класса адаптера, назовите его items и инициализируйте его в ограничителе this.items=items и снова tes
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(...)?
+ @Override public SimpleItem getItem(int position) { return items.get(position); }
да, это кажется правильным, и да, вам нужно установить адаптер для вашего списка в mainActivity, я предлагаю вам узнать больше о пользовательских адаптерах
попробуйте это и посмотрите свой список, получите какие-либо элементы или нет: 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.notifyDataSetChanged() , если он не работает, ваш пользовательский адаптер неправильный, и вы должны узнать о нем больше
В какой метод проекта я должен это вставить? 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
нет, в своем предыдущем комментарии я хотел протестировать ваш адаптер и, похоже, он работает. Я думаю, что ошибся в своем ответе в onActivityResult и создал новый список массивов! замените ArrayList<SimpleItem items=(ArrayList<SimpleItem>)data.getSerializableExtra("returnedList"); на items=(ArrayList<SimpleItem>)data.getSerializableExtra("returnedList");, он должен работать.
ArrayList<SimpleItem> items=new ArrayList<>(); находится в методе onCreate, поэтому в onActivityResult ссылка items невидима - Cannot resolve symbol 'items'public class MainActivity extends AppCompatActivity { ArrayList<SimpleItem> items=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ...Товар не отображается в списке. Может проблема с объектом-адаптером? В каком методе должна быть размещена эта строка final ItemAdapter mAdapter = new ItemAdapter(this, R.layout.simple_item_adapter,items);? Каким методом инициализировать этот адаптер?
Я имел в виду: "в каком методе должна появиться эта строка simpleItemsListView.setAdapter(mAdapter);?" как мой второй вопрос.
попробуй мой новый ответ на свою работу ты. в этом случае вы можете скопировать и вставить
попробуй это :
Основная деятельность :
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
Вы можете
startActivityForResultиз действия простых элементов, а затем, после добавления элементов в действие добавления элементов, установить результат с новым элементом и снова в активности списка элементов, получить новый элемент вonActivityResultи добавить элемент в адаптер списка