我有一個名為 HomeFragment 的 Fragment 包含來自 JSON 的 GridView 串列,該串列使用 Volley 請求。它的成功顯示 JSON 沒有任何問題,但問題是當我轉到另一個片段或活動然后再次回傳 HomeFragment 時,GridView 中的 JSON 再次增加/添加相同的資料。
如何阻止它使資料不增加。
HomeFragment 中有我的代碼
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_home, container, false);;
getActivity().setTitle("Dashboard");
final HashMap<String, String> role = sharedPreference.getDetails();
String url = "http://myurl";
RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject obj = new JSONObject(response);
JSONArray array = obj.getJSONArray("data");
for (int i = 0; i < array.length(); i ) {
JSONObject data = array.getJSONObject(i);
String menu_id = data.getString("menu_id");
String menu_name = data.getString("menu_name");
HashMap<String, String> row = new HashMap<>();
row.put("menu_id", menu_id);
row.put("menu_name", menu_name);
menulist.add(row);
Log.e(TAG, "onResponse: " menulist );
GridView gridView = (GridView) view.findViewById(R.id.menu_item_grid);
ListAdapter listAdapter = new SimpleAdapter(getContext(), menulist,
R.layout.home_menu, new String[]{"menu_name"},
new int[]{R.id.item_grid});
gridView.setAdapter(listAdapter);
}
} catch (JSONException ex) {
ex.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(), "error : " error, Toast.LENGTH_SHORT).show();
}
});
queue.add(stringRequest);
return view;
}
結果
謝謝..
uj5u.com熱心網友回復:
當您轉到另一個片段/活動時,您的 HomeFragment 不會立即銷毀,因此它的值 ( menulist) 仍會保留。但是當您回到它時,會再次創建視圖,并將來自 API 的新資料添加到之前的串列中。
在您的onResponse()方法中,清除menulist與menulist.clear()
menulist.clear();
JSONObject obj = new JSONObject(response);
JSONArray array = obj.getJSONArray("data");
這不會減少 API 呼叫,但會保持資料一致。
uj5u.com熱心網友回復:
當您從HomeFragmnttoOtherFragment回傳onCreateView()時再次呼叫,HomeFragment因此您的請求再次呼叫,因此您的資料是重復的。
您應該使 BaseFragment 執行以下代碼。它會幫助你。
Java 幫助
基礎片段.java
public class BaseFragment<T> extends Fragment {
public boolean hasInitializedRootView = false;
private View rootView;
public View getPersistentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState, int layout){
if (rootView == null) {
rootView = inflater.inflate(layout, container, false);
} else {
((ViewGroup) rootView.getParent()).removeView(rootView);
}
return rootView;
}
}
HomeFragment.java
public class HomeFragment extends BaseFragment<View> {
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
return getPersistentView(inflater, container, savedInstanceState, R.layout.fragment_home);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!hasInitializedRootView) {
hasInitializedRootView = true;
// Do your work here
}
}
}
Kotlin 幫助
基礎片段.kt
open class BaseFragment<T : View> : Fragment() {
var hasInitializedRootView = false
private var rootView: View? = null
fun getPersistentView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
layout: Int
): View? {
if (rootView == null) {
rootView = inflater.inflate(layout, container, false)
} else {
(rootView?.parent as? ViewGroup)?.removeView(rootView)
}
return rootView
}
}
HomeFragment.kt
class HomeFragment : BaseFragment<View>() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return getPersistentView(inflater, container, savedInstanceState, R.layout.fragment_home)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (!hasInitializedRootView) {
hasInitializedRootView = true
// Do your work here
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/357537.html
上一篇:如何將不可見布局設定為永久可見?
