2016-02-18 101 views
0

我正在製作一個應用程序,通過抽籤請求獲取一些數據,並將數據設置在ListFragment上的ListView中。Android ListFragment項目重複

我的問題是,當我使用後退按鈕轉換回上一個活動並退出應用程序時(onStop),當我從appdrawer重新打開應用程序並轉到ListFragment時,它顯示的列表被複制。

參考,照片下面:

Start of the app The list as it is shown at firstThe list after the app reopens from the onStop() state

的代碼:

的ListFragment類:

package lassebjoerklund.easyfridge; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.ListFragment; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

/** 
* Created by lassebjorklund on 17/02/16. 
*/ 
public class ProductsList extends ListFragment { 
    ProductListListnerInteface productListListnerInteface; 


    public interface ProductListListnerInteface { 
     public void onProductSelected(int pos); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d(getActivity().getClass().getSimpleName(), "onCreate"); 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState == null) { 
      setListAdapter(new ProductAdapter(getActivity(), BootActivity.getProductsToDisplayInlist())); 
     }else{ 

     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     Log.d(getActivity().getClass().getSimpleName(), "onAttach"); 
     super.onAttach(context); 
     try { 
      productListListnerInteface = (ProductListListnerInteface) context; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(context.toString() + "must implement ProductListListnerInteface"); 
     } 
    } 

    @Override 
    public void onStart() { 
     Log.d(getActivity().getClass().getSimpleName(), "onStart"); 
     super.onStart(); 
     if (getFragmentManager().findFragmentById(R.id.fragment_container_list) != null) { 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     } 


    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     productListListnerInteface.onProductSelected(position); 
    } 




} 

活性的結合與DetailFragment的ListFragment(不是部分的問題我國)

package lassebjoerklund.easyfridge; 

import android.app.Activity; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.KeyEvent; 

/** 
* Created by lassebjorklund on 17/02/16. 
*/ 
public class ProductViewController extends FragmentActivity implements ProductsList.ProductListListnerInteface { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.products_list_layout); 
      if (findViewById(R.id.fragment_container_list) != null) { 
       if (savedInstanceState != null) { 
        return; 
       } 
       ProductsList productsList = new ProductsList(); 
       productsList.setArguments(getIntent().getExtras()); 
       getFragmentManager().beginTransaction().add(R.id.fragment_container_list, productsList).commit(); 

      } 

    } 

    @Override 
    public void onProductSelected(int pos) { 
      ProductDetail productDetail = (ProductDetail) getFragmentManager().findFragmentById(R.id.details_fragment_container); 

     if (productDetail != null) { 

      productDetail.updateProductOnPos(pos); 

     } else { 
      ProductDetail newProductDetail = new ProductDetail(); 
      Bundle args = new Bundle(); 
      args.putInt("Position", pos); 
      newProductDetail.setArguments(args); 
      FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.fragment_container_list, newProductDetail); 
      fragmentTransaction.addToBackStack("ProductList"); 
      fragmentTransaction.commit(); 
     } 
    } 

} 

的發射活動

package lassebjoerklund.easyfridge; 

import android.app.Activity; 
import android.app.Fragment; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.JsonArrayRequest; 
import com.android.volley.toolbox.Volley; 

import org.json.JSONArray; 
import org.json.JSONObject; 

import java.util.ArrayList; 

public class BootActivity extends Activity { 
    private static ArrayList<Products> productsToDisplayInlist = new ArrayList<>(); 
    private String TAG = BootActivity.class.getSimpleName(); 
    private String url = "XXXXXXXXXXXXXXXXXXXX"; 
    private String jsonRespons = ""; 
    private RequestQueue rQueue; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     //Layout 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_boot_layout); 

     //Custom Adapter for list view, for ref. 
     //final ProductAdapter adapter = new ProductAdapter(this, productsToDisplayInlist); 

     //RequestQueue 
     rQueue = Volley.newRequestQueue(this); 

     //Methode to populate Arralist 


     //Intent to switch to activity 
     final Intent dispalyProductsIntent = new Intent(BootActivity.this, ProductViewController.class); 

     getRequest(); 

     final ImageButton updateViewButton = (ImageButton) findViewById(R.id.bViewProducts); 
     updateViewButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       startActivity(dispalyProductsIntent); 
      } 

     }); 

    } 

    public void getRequest() { 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() { 
      @Override 
      public void onResponse(JSONArray response) { 
       Log.d(TAG, response.toString()); 
       try { 
        for (int i = 0; i < response.length(); i++) { 
         JSONObject productToBuild = (JSONObject) response.get(i); 
         String name = productToBuild.getString("name"); 
         String type = productToBuild.getString("type"); 
         int id = productToBuild.optInt("id"); 
         String removalDate = productToBuild.getString("removal_date"); 
         String placementDate = productToBuild.getString("placement_date"); 
         Products product = new Products(name, placementDate, removalDate, type); 
         productsToDisplayInlist.add(product); 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d("Volly", "Error"); 
       error.printStackTrace(); 
      } 
     }); 

     rQueue.add(jsonArrayRequest); 
    } 

    public void postRequest() { 

    } 

    public static ArrayList<Products> getProductsToDisplayInlist() { 
     return productsToDisplayInlist; 
    } 

    @Override 
    protected void onResume() { 
     Log.d("onResume", "onResume"); 
     /*Toast toast = Toast.makeText(this, "onResume", Toast.LENGTH_LONG); 
     toast.show();*/ 
     super.onResume(); 

    } 

    @Override 
    protected void onRestart() { 
     Log.d("onRestart", "onRestart"); 
     /*Toast toast = Toast.makeText(this, "onRestart", Toast.LENGTH_SHORT); 
     toast.show();*/ 
     super.onRestart(); 
    } 

    @Override 
    protected void onStop() { 
     Log.d("onStop", "onStop"); 
     // productsToDisplayInlist.clear(); 
     super.onStop(); 
    } 

    @Override 
    protected void onPause() { 
     Log.d("onPause", "onPause"); 
     super.onPause(); 
    } 
} 

我似乎無法找到問題..誰能幫助?

回答

2

productsToDisplayInlist是靜態的,每次回到BootActivity時都不會重新創建,直到您的應用程序本身被重新創建。

當您收到回覆時,您只會添加到收藏中,所以每次收到回覆時都會添加重複項。

有很多方法可以解決這個問題,最簡單的方法就是將productsToDisplayInlist.clear()添加到onResponse()的開頭,因爲無論如何這個列表正在被完全重新填充。

+0

謝謝,這是訣竅! – Lasse

0

我認爲問題是在BootActivity中,在向HTTP響應中添加產品之前,您沒有清除productsToDisplayInList(productsToDisplay.clear();)。 productsToDisplayInList是靜態的,這意味着它在整個應用程序的整個生命週期中保持其狀態。我不是100%肯定的,但可能是因爲應用程序仍在後臺運行,所以無論何時將最後活動保留在堆棧中(退出應用程序),它都會包含數據。