2016-03-31 1 views
2

コントローラークラスからリサイクルアダプターを取り込み、アプリケーション内のロジックを分割しようとしています。しかし、私はそれが動作するように見えることはできません..リクエストは別のスレッドで実行されている、ビューが表示される前に更新されていません。私は間違って何をしていますか?コントローラークラスからリサイクルアダプターを移入する

FragmentClass:

package lassebjoerklund.homecontrol.views.fragments; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.android.volley.Response; 
import com.android.volley.VolleyError; 

import org.json.JSONArray; 

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 

import lassebjoerklund.homecontrol.R; 
import lassebjoerklund.homecontrol.adapters.FridgeFragmentOverViewAdapter; 
import lassebjoerklund.homecontrol.controllers.FridgeController; 
import lassebjoerklund.homecontrol.decorations.DividerItemDecoration; 
import lassebjoerklund.homecontrol.model.Product; 
import lassebjoerklund.homecontrol.utils.FragmentUtil; 


/** 
* Created by zigge on 29-Mar-16. 
*/ 
public class FridgeFragmentOverView extends Fragment { 
    private final FridgeController fridgeController = new FridgeController(); 
    private RecyclerView recyclerView; 
    private LinkedList<String> types; 
    private FridgeFragmentOverViewAdapter adapter; 


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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_overview_layout, container, false); 

     recyclerView = (RecyclerView) v.findViewById(R.id.productOverviewRecycleView); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST); 
     recyclerView.addItemDecoration(itemDecoration); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext()); 
     recyclerView.setLayoutManager(layoutManager); 
     adapter = new FridgeFragmentOverViewAdapter(fridgeController.getProductsTypes()); 
     recyclerView.setAdapter(adapter); 
     return v; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     fridgeController.refresh(getContext(), adapter); 
    } 


} 

コントローラクラス:

package lassebjoerklund.homecontrol.controllers; 

import android.content.Context; 

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

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

import java.util.ArrayList; 
import java.util.List; 

import lassebjoerklund.homecontrol.adapters.FridgeFragmentOverViewAdapter; 
import lassebjoerklund.homecontrol.interfaces.OnSucsess; 
import lassebjoerklund.homecontrol.model.Product; 

/** 
* Created by zigge on 29-Mar-16. 
*/ 
public class FridgeController implements OnSucsess { 
    private RequestQueue rQueue; 
    private ArrayList<Product> products; 
    private List<String> productsTypes; 


    public ArrayList<Product> getProducts() { 
     return products; 
    } 

    public List<String> getProductsTypes() { 
     return productsTypes; 
    } 


    public void refresh(Context context, final FridgeFragmentOverViewAdapter adapter) { 
     String fetchProducts = "http://87.52.28.25:900/index.php"; 
     rQueue = Volley.newRequestQueue(context); 
     final JsonArrayRequest getProductsRequest = new JsonArrayRequest(fetchProducts, new Response.Listener<JSONArray>() { 

      @Override 
      public void onResponse(JSONArray response) { 
       products = new ArrayList<>(); 
       productsTypes = new ArrayList<>(); 
       try { 
        for (int i = 0; i < response.length(); i++) { 
         JSONObject jsonObject = (JSONObject) response.get(i); 
         String barcode = jsonObject.getString("code"); 
         String name = jsonObject.getString("name"); 
         String ex_date = jsonObject.getString("ex_date"); 
         String add_date = jsonObject.getString("add_date"); 
         String type = jsonObject.getString("type"); 
         Product product = new Product(barcode, name, ex_date, add_date, type); 
         products.add(product); 
        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       if (products.size() != 0) { 
        for (int i = 0; i < products.size(); i++) { 
         if (!productsTypes.contains(products.get(i).getType())) { 
          productsTypes.add(products.get(i).getType()); 
         } 
        } 
       } 
       getProductsOnsucsess(adapter); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       error.printStackTrace(); 
      } 

     }); 
     rQueue.add(getProductsRequest); 
    } 

    @Override 
    public void getProductsOnsucsess(FridgeFragmentOverViewAdapter adapter) { 
     adapter.refreshAdapter(productsTypes); 
    } 
} 

アダプタ:

package lassebjoerklund.homecontrol.adapters; 

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

import lassebjoerklund.homecontrol.R; 
import lassebjoerklund.homecontrol.model.Product; 

/** 
* Created by zigge on 29-Mar-16. 
*/ 
public class FridgeFragmentOverViewAdapter extends RecyclerView.Adapter { 

    private List<String> types; 

    public FridgeFragmentOverViewAdapter(List<String> types) { 
     this.types = types; 
    } 

    @Override 
    public int getItemCount() { 
     return 0; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_overview_card_layout, null); 
     return new ProductsGroupedHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    } 

    public class ProductsGroupedHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     private TextView tvTypeOfProduct, tvCount, tvExpired; 

     public ProductsGroupedHolder(View itemView) { 
      super(itemView); 
      tvTypeOfProduct = (TextView) itemView.findViewById(R.id.tvTypeOfProduct); 
      tvCount = (TextView) itemView.findViewById(R.id.tvCount); 
      tvExpired = (TextView) itemView.findViewById(R.id.tvExpired); 

     } 

     @Override 
     public void onClick(View v) { 

     } 
    } 

    public void refreshAdapter(List<String> types) { 
     if(this.types != null) { 
      this.types.clear(); 
      this.types = types; 
      notifyDataSetChanged(); 
     }else { 
      this.types = types; 
      notifyDataSetChanged(); 
     } 
    } 
} 

答えて

1

getItemType()メソッドreturn 0を設定したような単純な外観です。 このメソッドは、あなたのRecyclerViewのアイテム数を決定します。

@Override 
public int getItemCount() { 
    return type.size(); 
} 
+0

すっごい.. OFCは..感謝..アダプタを投稿するのを忘れました。そのメソッドを完全に見落としました.. – Lasse

+1

私はそれを持っていてうれしいです。私はそれを5つの項目を追加している場合、代わりにnotifyDatasetChange()を使用しないでください(0,5); これは、リストの先頭に5つの項目を追加します –

2

は呼び出してみてください。

adapter.notifyDataSetChanged(); 
更新後は

となります。

編集1:

getItemCount()でアダプタ項目のリターン実際のサイズ@prathamkesarkarが言ったように。

+0

更新の質問は、申し訳ありません.. – Lasse

関連する問題