Fragment和ListView使用冲突,导致ListView数据重复的问题

来源:5-8 项目作业

AgonyX

2020-08-24 21:31:52

起初按照教程使用replace()而不是add()方法来加载Fragment,但是发现再次切回有ListView的Fragment时发现其数据被重复了。本来查阅后知道每次设置适配器前可以使用listview.clear()先清除数据,的确可行。但是另一个方法是用FragmentTransaction.hide()方法来规避重复数据,但是找不到相应的例子学习,想在这请教一下。

这是MainActivity

package com.example.imoocprojhw_grouppurchase;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.PopupWindow;
import android.widget.Switch;
import android.widget.Toast;

import com.example.imoocprojhw_grouppurchase.Fragment.AccountFragment;
import com.example.imoocprojhw_grouppurchase.Fragment.IndexFragment;
import com.example.imoocprojhw_grouppurchase.Fragment.ShopFragment;

public class MainActivity extends AppCompatActivity {

    IndexFragment index;
    ShopFragment shop;
    AccountFragment account;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        index = new IndexFragment();
        shop = new ShopFragment();
        account = new AccountFragment();
        //创建添加并开启Fragment事务
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.fragment_container, index);
        transaction.commit();
    }

    //点击替换并提交Fragment
    public void myClick(View view) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        switch (view.getId()) {
            case R.id.nav_index_btn:
                transaction.replace(R.id.fragment_container, index);
                break;
            case R.id.nav_shop_btn:
                transaction.replace(R.id.fragment_container, shop);
                break;
            case R.id.nav_account_btn:
                transaction.replace(R.id.fragment_container, account);
                break;
        }
        transaction.commit();
    }
}

这是IndexFragment

package com.example.imoocprojhw_grouppurchase.Fragment;

import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.example.imoocprojhw_grouppurchase.CityListActivity;
import com.example.imoocprojhw_grouppurchase.MainActivity;
import com.example.imoocprojhw_grouppurchase.R;
import com.example.imoocprojhw_grouppurchase.Util.DataUtil;
import com.example.imoocprojhw_grouppurchase.Util.Good;
import com.example.imoocprojhw_grouppurchase.Util.MyBaseAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static android.app.Activity.RESULT_OK;


public class IndexFragment extends Fragment {

    private Button cityList_btn;
    private TextView cityList_txt;
    private GridView gridView;
    private List<Map<String, Object>> gridViewList = new ArrayList<>();
    private ListView listView;
    private List<Good> listViewList = new ArrayList<>();

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

        View view = inflater.inflate(R.layout.fragment_index, container, false);
        //定位各View对象
        findViews(view);
        //通过监听器打开城市列表
        cityList_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent(getContext(), CityListActivity.class), 1);
            }
        });
        //设置上部图标GridView
        setGridView();
        //设置商品ListView
        setListView();

        return view;
    }

    private void findViews(View view) {
        cityList_btn = view.findViewById(R.id.cityList_btn);
        cityList_txt = view.findViewById(R.id.cityList_txt);
        gridView = view.findViewById(R.id.gridView);
        listView = view.findViewById(R.id.listView);
    }

    private void setGridView() {
        //清除数据避免切换时出现重复
        gridViewList.clear();
        //数据源
        for (int i = 0; i < DataUtil.indexFragment_gridView_img.length; i++) {
            Map<String, Object> map = new HashMap<>();
            map.put("img", DataUtil.indexFragment_gridView_img[i]);
            map.put("txt", DataUtil.indexFragment_gridView_txt[i]);
            gridViewList.add(map);
        }

        String[] from = {"img", "txt"};
        int[] to = {R.id.img, R.id.txt};

        SimpleAdapter adapter = new SimpleAdapter(getContext(), gridViewList, R.layout.fragment_index_gridview_item, from, to);

        gridView.setAdapter(adapter);
    }

    private void setListView() {
        //清除数据避免切换时出现重复
        listViewList.clear();
        //数据源
        for (int i = 0; i < DataUtil.Good.img.length; i++) {
            Good good = new Good(DataUtil.Good.img[i], DataUtil.Good.name[i],
                    DataUtil.Good.detail[i], DataUtil.Good.price[i]);
            listViewList.add(good);
        }

        BaseAdapter adapter = new MyBaseAdapter(getContext(), listViewList);

        listView.setAdapter(adapter);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            //接受CityActivity传来的数据
            if (requestCode == 1) {
                Toast.makeText(getContext(), "已选择城市:" + data.getStringExtra("city"), Toast.LENGTH_SHORT).show();
                //改变城市文本
                cityList_txt.setText(data.getStringExtra("city"));
            }
        }
    }
}


写回答

1回答

好帮手慕雪

2020-08-26

与add()一样,还是用FragmentTransaction来管理显示和隐藏fragment:隐藏某fragment时用hide(),显示某fragment时用show()。祝:学习愉快

0

0 学习 · 2907 问题

查看课程