如何将在片段中创建的ArrayList <string>传递给主活动

时间:2019-03-29 07:26:28

标签: java android android-fragments

我有一个包含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 个答案:

答案 0 :(得分:1)

您应该在MainActivity中声明ArrayList<String> items。然后为项目创建一个公共的setter方法。

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

然后,您应该在片段中调用setItems()方法。

((MainActivity) getActivity()).setItems(items);

答案 1 :(得分:1)

回调接口

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中的公共设置更好。因为,就像更多的SOLID代码一样。在这种情况下,您的“片段”不保存对“活动”的引用,甚至不知道它的存在。

答案 2 :(得分:0)

1。定义一个接口,2.让您的Activity实现接口3.使用(interface)getActivity()将Activity转换为该接口,然后您可以在该接口中调用方法以将ArrayList发送给“ items”