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()。祝:学习愉快
相似问题
回答 2
回答 1