Как я могу передать ArrayList <String>, созданный во фрагменте, в основное действие - PullRequest
1 голос
/ 29 марта 2019

У меня есть меню ящика с 3 пунктами (Ресторан, Кино, Еда). Они в основном 3, чтобы сделать списки. Каждый список имеет свой фрагмент и в представлении есть способ добавить элементы в список. Список ресторанов, список фильмов и список продуктов. Мне нужно иметь возможность поделиться этим списком (через любой канал общего доступа), щелкнув значок общего доступа, который находится на панели инструментов. Это мой фрагмент, в котором я заполняю список элементов, которые я хочу использовать, когда щелкаю значок общего доступа на панели инструментов. В основном мне нужно передать «элементы» в MainActivity и использовать его.

package com.example.mylists;

import android.content.Intent;

public class FoodFragment extends Fragment  {
public FoodFragment() {
    // Required empty public constructor
}
private ArrayList<String> items;
private ArrayAdapter<String> itemsAdapter;
private ListView lvItems;
private static final String TAG = "FoodFragment";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.i(TAG, "in on onCreateView ");
    View view = inflater.inflate(R.layout.fragment_food, container, false);
    lvItems = (ListView) view.findViewById(R.id.lvItems);
    items = new ArrayList<String>();
    readItems();
    itemsAdapter = new ArrayAdapter<String>(view.getContext(),android.R.layout.simple_list_item_1, items);
    lvItems.setAdapter(itemsAdapter);
    if (items.isEmpty())
        items.add("Dummy Item");
    final EditText newTask    = (EditText) view.findViewById(R.id.etNewItem);
    Button btnAdd = (Button) view.findViewById(R.id.btnAddItem);

    btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String itemText = newTask.getText().toString();
            itemsAdapter.add(itemText);
            newTask.setText("");
            writeItems();
            Log.i(TAG, "in on send data ");
        }
    });
    return view;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    Log.i(TAG, "in on onViewCreated ");

    super.onViewCreated(view, savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    Log.i(TAG, "in on onActivityCreated ");

    super.onActivityCreated(savedInstanceState);

    OnItemLongClickListener listener = new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long id) {
            //Log.i(TAG, "in on onItemLongClick ");
            //Toast.makeText( getActivity().getBaseContext()  , "Long Clicked " , Toast.LENGTH_SHORT).show();
            items.remove(position);
            itemsAdapter.notifyDataSetChanged();
            writeItems();
            //return true;
            return false;
        }
    };
    lvItems.setOnItemLongClickListener(listener);
}

private void readItems() {
    File filesDir = getContext().getFilesDir();
    File todoFile = new File(filesDir, "todo.txt");
    try {
        items = new ArrayList<String>(FileUtils.readLines(todoFile));
    } catch (IOException e) {
        items = new ArrayList<String>();
    }
}

private void writeItems() {
    File filesDir = getContext().getFilesDir();
    File todoFile = new File(filesDir, "todo.txt");
    try {
        FileUtils.writeLines(todoFile, items);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Вы должны объявить ArrayList<String> items в своей основной деятельности.Затем создайте метод открытого сеттера для элементов.

public void setItems(ArrayList<String> items){
   this.items = items;
}

Затем вы должны вызвать метод setItems() в своем фрагменте.

((MainActivity) getActivity()).setItems(items);
1 голос
/ 29 марта 2019

Интерфейс для обратного вызова

interface MyInterface {
    void setItems(ArrayList<String> items);
}

В вашей активности:

class MyActivity {
    ArrayList<String> items;

    MyInterface itemsCallback = new MyInterface(){
        @Override
        void setItems(ArrayList<String> items){
            this.items = items;
        }
    }

    myFragment.setItemsCallback(itemsCallback);
}

А затем во фрагменте

class MyFragment {
    private MyInterface itemsCallback;
    public void setItemsCallback(MyInterface itemsCallback){
        this.itemsCallback = itemsCallback;
    }

    private void readItems(){
        ...
        itemsCallback.setItems(items); 
    }
}

Я думаю, это лучше, чем публичный сеттер в MainActivity.,Потому что, вы знаете, это как более твердый код.В этом случае ваш фрагмент не содержит ссылки на активность и даже не знает о ее существовании.

0 голосов
/ 29 марта 2019

1. Определите интерфейс, 2. Пусть ваш Activity реализует интерфейс 3.use (interface) getActivity () для приведения вашего Activity к этому интерфейсу, затем вы можете вызвать метод в интерфейсе для отправки вашего ArrayList "items"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...