1

這就是我在我的搜索片段中設置我的Recycler視圖的方式。我不明白爲什麼我一直得到相同的錯誤和我錯過的東西。未連接適配器;使用改造時跳過佈局

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_search, container, false); 
    searchText = (EditText)view.findViewById(R.id.searchText); 
    searchButton = (Button)view.findViewById(R.id.searchButton); 
    nutritionRecyclerView = (RecyclerView)view.findViewById(R.id.nutritionRecyclerView); 
    layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); 
    searchButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ApiClient.getInstance().getNutritionApiAdapter() 
        .getSearchResults(
          AppDefines.APPLICATION_ID, 
          AppDefines.APPLICATION_KEY, 
          searchText.getText().toString()) 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Observer<SearchResultsModel>() { 
         @Override 
         public void onCompleted() { 

         } 

         @Override 
         public void onError(Throwable e) { 

         } 

         @Override 
         public void onNext(SearchResultsModel searchResultsModel) { 

          // On handling the http response, instantiate a new adapter with the results 
          adapter = new NutritionAdapter(searchResultsModel.getSearchResults()); 

          adapter.setOnItemSelected(new NutritionAdapter.OnItemSelected() { 
           @Override 
           public void onSelected(NutritionItemModel item) { 
            if (onFragmentEvent != null) { 
             onFragmentEvent.onEvent(item); 
            } 
           } 
          }); 

          // Assigning the LayoutManager to the RecyclerView 
          nutritionRecyclerView.setLayoutManager(layoutManager); 
          // Assigning the Adapter to the RecyclerView. If this isn't done, the view will not populate 
          nutritionRecyclerView.setAdapter(adapter); 
         } 
        }); 
     } 
    }); 




    return view; 
} 

這裏是我的ApiClient 公共類ApiClient { 私有靜態ApiClient實例;

public static ApiClient getInstance() { 
    if (instance == null) { 
     instance = new ApiClient(); 
    } 

    return instance; 
} 

public NutritionApiAdapter getNutritionApiAdapter() { 
    NutritionApiAdapter api = new Retrofit.Builder() 
      .baseUrl(AppDefines.BASE_API_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build() 
      .create(NutritionApiAdapter.class); 

    return api; 
} 
} 

這是我NutritionApiAdapter

public interface NutritionApiAdapter { 
@GET("item") 
Observable<SearchResultsModel> getSearchResults(
     @Query("_app_id") String appId, 
     @Query("_app_key") String appKey, 
     @Query("q") String searchString); 
} 

NutritionAdpater

public class NutritionAdapter extends RecyclerView.Adapter<NutritionItemViewHolder>{ 


private ArrayList<NutritionItemModel> nutritionItemCollection; 
private OnItemSelected onItemSelected; 

public NutritionAdapter(ArrayList<NutritionItemModel> nutritionItemCollection){ 
    this.nutritionItemCollection = nutritionItemCollection; 
} 


@Override 
public NutritionItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_nutrition, parent, false); 
    return new NutritionItemViewHolder(view); 
} 

@Override 
public void onBindViewHolder(NutritionItemViewHolder holder,int position) { 
    NutritionItemModel item = nutritionItemCollection.get(position); 
    holder.setOnRecipeItemClicked(new NutritionItemViewHolder.OnNutritionItemClicked(){ 
     @Override 
     public void onClick(NutritionItemModel item) { 
      if(onItemSelected != null) { 
       onItemSelected.onSelected(item); 
      } 
     } 
    }); 

    // Bind the RecipeItemModel data to the view managed by the ViewHolder 
    holder.bind(item); 
} 

@Override 
public final void onViewRecycled(final NutritionItemViewHolder holder) { 
    super.onViewRecycled(holder); 
    holder.setOnRecipeItemClicked(null); 
    holder.unbind(); 
} 

@Override 
public int getItemCount() {return nutritionItemCollection.size();} 

public void setOnItemSelected(OnItemSelected onItemSelected) { 
    this.onItemSelected = onItemSelected; 
} 
public interface OnItemSelected { 
    void onSelected(NutritionItemModel item); 
} 

} 

和NutritionItemViewHolder

public class NutritionItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
private TextView foodName; 
private ImageView foodThumbnail; 
private NutritionItemModel item; 
private TextView item_name; 
private TextView brand_name; 
private OnNutritionItemClicked onNutritionItemClicked; 

//todo add other elements here 

public NutritionItemViewHolder(final View itemView) {super(itemView);} 

public final void bind(final NutritionItemModel item) { 

    item_name = (TextView)itemView.findViewById(R.id.item_name); 
    brand_name = (TextView)itemView.findViewById(R.id.brand_name); 


    //foodThumbnail = (ImageView)itemView.findViewById(R.id.foodThumbnail); 
    //todo add other element id things here 

    /* 
    //used for preloading images 
    Glide.with(itemView.getContext()) 
      .load(item.getSmallImageUrls().get(0)) 
      .into(foodThumbnail); 
     */ 

    item_name.setText(item.getFields().getItem_name()); 
    brand_name.setText(item.getFields().getBrand_name()); 
} 

public final void unbind() { 
    //todo ? 
    //For later with butterknife 
} 

@Override 
public void onClick(View v) { 
    if(onNutritionItemClicked != null) { 
     onNutritionItemClicked.onClick(item); 
    } 
} 

// The setter that allows other classes to create a reference to the listener. 
public void setOnRecipeItemClicked(OnNutritionItemClicked onNutritionItemClicked) { 
    this.onNutritionItemClicked = onNutritionItemClicked; 
} 

// An interface is added as an internal implementation in our ViewHolder. This will allow 
// classes that instantiate a new instance of this ViewHolder to subscribe to this interface 
// and listen for events. 
public interface OnNutritionItemClicked { 
    void onClick(NutritionItemModel item); 
} 

} 
+0

你能在這裏粘貼你的錯誤嗎? – xiaoyaoworm

回答

0

設置佈局管理器,

LinearLayoutManager llm = new LinearLayoutManager(this); 
llm.setOrientation(LinearLayoutManager.VERTICAL); 
list.setLayoutManager(llm); 
list.setAdapter(adapter); 

也許這可以幫到你。

相關問題