更新其值

时间:2018-02-20 15:05:39

标签: android arraylist reference duplicates copy

我有一个包含多个选项卡的tabhost,每个选项卡包含列表视图中列出的一定数量的操作。要填充该列表视图,我使用ArrayList。

首次创建标签,evertything工作正常。当我尝试按年过滤列表时出现问题。过滤的过程很好,因为我可以在调试中看到过滤后的列表,没关系。

问题是,在过滤后,我重新创建选项卡以便再次填充所有列表视图。要打开标签,我使用此代码。它会创建与列表中的不同货币一样多的选项卡:

public static void openFragments(FragmentTabHost tabHost, ArrayList<Posicion> positions, Class FragmentResumen, Class FragmentDetails ) {

    //==========================================================================================
    //  This method open as many tabs as different currencies there are in positions list
    //==========================================================================================

    ArrayList<String> currencies = Currency.getDifferentCurrencies(positions);

    tabHost.clearAllTabs();

    for (int i = 0; i < currencies.size() + 1; i++) {

        String tabName = "", tabSpec = "";
        Class fragmentToOpen;
        Bundle arg1 = new Bundle();

        //A general tab is first created
        if (i == 0)
        {
            tabName = "All";
            tabSpec = "General";
            arg1.putString("moneda", tabName);
            arg1.putSerializable("posiciones", positions);
            fragmentToOpen = FragmentResumen;
        }
        //The rest of tabs for currencies are created
        else
        {
            tabName = currencies.get(i - 1);
            tabSpec = "Tab" + (i - 1);
            arg1.putString("moneda", tabName);
            arg1.putSerializable("posiciones", positions);
            fragmentToOpen = FragmentDetails;
        }

        tabHost.addTab(tabHost.newTabSpec(tabSpec).setIndicator(tabName), fragmentToOpen, arg1);
    }
}

正如我之前所说,这总是很好。

我第一次需要创建标签我用它来调用它:

openFragments(tabHost, positions, FragmentResumenMedio.class, FragmentDetailsMedio.class);

然后我有一个显示DatePicker的按钮,当用户选择一年时,我关闭对话框并重新绘制标签,如下所示:

ArrayList<Posicion> positionsFiltered = General.makeHardCopyOfArrayListPosition(positions);
            for(Posicion posicion : positionsFiltered)
            {
                Boolean matchFilters = filterPositionsByYear(posicion, year + "");
                if(matchFilters == false){
                    positions.remove(posicion);
                }
            }

            General.openFragments(tabHost, positions, FragmentResumenMedio.class, FragmentDetailsMedio.class);

当我调试最后一个函数时,我可以看到位置在过滤后具有正确的值但是当我单击新选项卡时,它会显示没有过滤的列表,我不知道如何解决这个问题。

非常感谢。

修改

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //Initialize view and tabhost
    View rootView = inflater.inflate(R.layout.fragment_medio, container, false);
    tabHost = (FragmentTabHost) rootView.findViewById(android.R.id.tabhost);
    tabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);

    return tabHost;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);


    //onCreatedView is only called the first time so we must ensure that tabhost is not null before adding tabs
    if(tabHost == null) {

        tabHost = (FragmentTabHost) getView().findViewById(android.R.id.tabhost);
        tabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);
    }

    FloatingActionButton floatingActionButton = (FloatingActionButton) getView().findViewById(R.id.floatingButton);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            positions = new ArrayList<>(positionsFiltered);
            createDialogWithoutDateField().show();
        }
    });

    //Check if any update has been made since the last open
    SharedPreferences prefs = getActivity().getPreferences(MODE_PRIVATE);
    Boolean updateMedioRequired = prefs.getBoolean(updateOperationsMedioPlazo, true);
    if (updateMedioRequired != null)
    {
        if (updateMedioRequired == true)
        {
            //Update variable that indicates if changes have been made or not
            SharedPreferences.Editor editor = getActivity().getPreferences(MODE_PRIVATE).edit();
            editor.putBoolean(updateOperationsMedioPlazo, false);
            editor.apply();

            //Check if there are previously stored operations
            if (operations.size() > 0)
            {
                //Show a progressDialog as prices have to be downloaded from internet and this can be a time consumming task
                progress = ProgressDialog.show(getActivity(), "Obteniendo precios",
                        "Un momento por favor...", true);

                //Generate positions from operations list and wait for result in "onStockPriceResult". If there are no changes, positions variable has already values
                if(positions.size() == 0) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            positions = MedioPlazoCalculations.generatePositions(listener, getActivity(), operations);
                        }
                    }).start();
                }
            }
            else
            {
                Toast.makeText(getActivity(), "Aún no se ha introducido ninguna operación", Toast.LENGTH_LONG).show();
            }
        }
        else
        {
            //If no update needed, variable coming from MainActivity has positionList. Open as many new fragments as currencies there are in positionsList
            General.openFragments(tabHost, positions, FragmentResumenMedio.class, FragmentDetailsMedio.class);
        }
    }
}

编辑2:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    {
        if(getActivity()!=null)
        {
            Bundle bundle = this.getArguments();
            positions = (ArrayList<Posicion>) bundle.getSerializable("posiciones");
            moneda = (String) bundle.getString("moneda");
        }
    }
}

编辑3:如果我放置注释指令,则过滤不起作用。如果我删除它,过滤工作,但我不能再次过滤,因为列表的值具有过滤版本而不是原始版本

    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            positions = new ArrayList<>(positionsFiltered);
            createDialogWithoutDateField().show();
        }
    });

0 个答案:

没有答案