簡體   English   中英

如何傳遞ArrayList <String> 在主要活動的片段中創建

[英]How can I pass a ArrayList<String> created in a fragment to the main activity

我有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();
    }
}
}

您應該在MainActivity中聲明ArrayList<String> items 然后為項目創建一個公共的setter方法。

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

然后,您應該在片段中調用setItems()方法。

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

回調接口

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代碼一樣。 在這種情況下,您的片段不保存對活動的引用,甚至不知道它的存在。

1.定義一個接口,2.讓您的Activity實現該接口3.使用(interface)getActivity()將您的Activity轉換為該接口,然后您可以在該接口中調用方法以將ArrayList發送給“項目”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM