我有一个包含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();
}
}
}
答案 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”