Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从getter以片段形式写入listView?_Android_Listview_Android Fragments_Getter Setter - Fatal编程技术网

Android 如何从getter以片段形式写入listView?

Android 如何从getter以片段形式写入listView?,android,listview,android-fragments,getter-setter,Android,Listview,Android Fragments,Getter Setter,我试图在片段中填充列表视图,数据来自另一个片段的getter集。但是,当我从第一个片段添加更多项时,我会不断覆盖数据,而不是添加新数据 我尝试在Stackoverflow上找到许多解决方案,但没有一个对我有效。我很确定这是因为每次代码运行时我都会实例化一个新的列表,但我似乎不知道如何解决这个问题 下面的代码是通过底部的getData()方法接收数据的片段 public class FoodFragment extends Fragment { ImageButton addFood;

我试图在
片段中填充
列表视图
,数据来自另一个
片段的getter集。但是,当我从第一个
片段添加更多项时,我会不断覆盖数据,而不是添加新数据

我尝试在Stackoverflow上找到许多解决方案,但没有一个对我有效。我很确定这是因为每次代码运行时我都会实例化一个新的列表,但我似乎不知道如何解决这个问题

下面的代码是通过底部的
getData()
方法接收数据的
片段

public class FoodFragment extends Fragment {

    ImageButton addFood;
    String foods, carbo, protein, fats;
    ListView listView;
    ArrayList<String> itemList;
    ArrayAdapter<String> adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_food, container, false);


        addFood = view.findViewById(R.id.addFood);
        listView = view.findViewById(R.id.caloriesEaten);

        itemList = new ArrayList<>();
        getInfo();

        if(foods != null) {
            for(int i = 0; i <1; i++){
                itemList.add(foods);
            }
        }

        adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, itemList);
        listView.setAdapter(adapter);

        addFood.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction fr = getFragmentManager().beginTransaction();
                fr.replace(R.id.fragment_container, new TrackingFragment());
                fr.addToBackStack(null).commit();
            }
        });
        return view;
    }

    public void getInfo(){
        TrackingActivity trackingActivity = new TrackingActivity();
        foods = trackingActivity.getName();
        carbo = trackingActivity.getCarbohydrates();
        protein = trackingActivity.getProtein();
        fats = trackingActivity.getFats();

    }
}
公共类FoodFragment扩展了片段{
食物;
串食品、碳水化合物、蛋白质、脂肪;
列表视图列表视图;
ArrayList项目列表;
阵列适配器;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u食品,容器,假);
addFood=view.findviewbyd(R.id.addFood);
listView=view.findViewById(R.id.carorieseaten);
itemList=新的ArrayList();
getInfo();
如果(食物!=null){

对于(int i=0;i当您使用和适配器时,您可以在它和元素集合之间创建一个链接,您可以随时更改该链接

每次向itemList添加元素时,您都在用户界面范围之外工作,因此必须在适配器上调用notifyDataSetChanged(),以将UI ListView与itemList ArrayList重新对齐

在本例中,首先确保您在getInfo()中从源代码中获得了所需的数据,然后可能需要将添加的元素移动到onclick侦听器中

还请记住,每次应用程序中发生配置更改时,都会调用onCreateView函数,因此在这种情况下,将不断重新创建itemList

还要检查getinfo函数:据我所知,它从每次调用中重新创建一个新对象,以便强制该对象具有默认值。 这不是实现您试图实现的行为的正确方法:与其使用活动来存储重要数据,不如使用一个简单的java类,该类通过引用在片段之间共享

希望这能给你一些帮助或提示。
干杯。

更改Arraylist上的值,然后在适配器上调用“notifyDataSetChanged()”。我不确定我是否理解您的答案。例如,如果我使用itemList.add(foods,I),我将只获取同一项的I数量。然后,当我使用另一项再次运行代码时,我将获取该项的I数量。它将覆盖列表中已存在的项,并停止添加新项。例如,假设您使用数组列表x。如果您使用x制作适配器,则可以使用x执行任何操作,无论何时调用notifyDataSetChanged()在适配器上,它将检查x变量保存的值并相应更新,无论您是否删除了以前的值。仅在第一次尝试创建itemList,即将
itemList=new ArrayList();
更改为
if(itemList==null)itemList=new ArrayList()
。希望有帮助!否则,请澄清“当我从第一个片段添加更多项目时”,第一个片段是什么?如何从第一个片段转到这个片段?以及
的目的是什么(int i=0;感谢您的回复。我正在获取填充listView所需的信息。thís类中的onClickListener只需一个按钮,即可更改为另一个片段,其中该信息由用户选择。我将再次查看notifyDataSetChanged()。谢谢。