2017-03-01 106 views
0

我有一个RecyclerView,它正确显示了我的CardView。 CardView还包含一个RecyclerView,我试图用硬编码的数据来显示它。问题是我声明了第二个RecyclerView后,在.setHasFixedSize(true)或任何行上得到空值。从另一个RecyclerView调用它时为空RecyclerView

我在第一个创建后调用第二个RecyclerView ......我想。

public class MainActivity extends AppCompatActivity { 
    TextView mWeatherTemp, mWeatherDescript; 
    Context context; 
    private ArrayList days; 
    private GridLayoutManager gridLayoutManager; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     context = getApplicationContext(); 
     Toolbar mToolbar = (Toolbar) findViewById(R.id.mMainToolbar); 
     setSupportActionBar(mToolbar); 
     mToolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.weather_cool)); 

     mWeatherTemp = (TextView) findViewById(R.id.tvWeatherTemp); 
     mWeatherDescript = (TextView) findViewById(R.id.tvWeatherText); 

     Typeface robotDisplay3 = Typeface.createFromAsset(context.getAssets(), 
       "font/Roboto-Regular.ttf"); 
     mWeatherTemp.setTypeface(robotDisplay3); 
     initCardView(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.settings, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    public void initCardView() { 
     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.mMainRV); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context); 
     recyclerView.setLayoutManager(layoutManager); 
     days = new ArrayList(); 
     days.add("TODAY"); 
     days.add("TOMORROW"); 
     RecyclerView.Adapter adapter = new HomeRecyclerAdapter(days); 
     recyclerView.setAdapter(adapter); 

     initHourlyGrid(); 
    } 

    public void initHourlyGrid() { 
     List<HourlyForcast> listItem = getAllItemList(); 
     gridLayoutManager = new GridLayoutManager(getApplicationContext(), 4); 
     RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.hourlyRecycler); 
     mRecyclerView.setHasFixedSize(true); //getting error here but happens if I comment this out, I am calling this method after the first RecyclerView method is called. So not sure whats going on. 
     mRecyclerView.setLayoutManager(gridLayoutManager); 
     RecyclerView.Adapter mAdapter = new HourlyForcastAdapter(getApplicationContext(), listItem); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

    private List<HourlyForcast> getAllItemList() { 
     List<HourlyForcast> allHours = new ArrayList<>(); 
     allHours.add(new HourlyForcast("4:00 PM", "8°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("5:00 PM", "6°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("6:00 PM", "5°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("7:00 PM", "3°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("8:00 PM", "3°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("9:00 PM", "3°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("10:00 PM", "4°", R.mipmap.ic_launcher)); 
     allHours.add(new HourlyForcast("11:00 PM", "60°", R.mipmap.ic_launcher)); 

     return allHours; 
    } 
} 

public class HourlyForcastAdapter extends RecyclerView.Adapter<HourlyForcastAdapter.HourlyViewHolder> { 
    private List<HourlyForcast> itemList; 
    private Context context; 

    public HourlyForcastAdapter(Context context, List<HourlyForcast> itemList) { 
     this.itemList = itemList; 
     this.context = context; 
    } 

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

    @Override 
    public void onBindViewHolder(HourlyViewHolder holder, int position) { 
     holder.mTimeText.setText(itemList.get(position).getTime()); 
     holder.mDegreeText.setText(itemList.get(position).getDegrees()); 
     holder.mWeatherIcon.setImageResource(itemList.get(position).getImageID()); 
    } 

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

    public static class HourlyViewHolder extends RecyclerView.ViewHolder { 
     TextView mTimeText, mDegreeText; 
     ImageView mWeatherIcon; 

     public HourlyViewHolder(View itemView) { 
      super(itemView); 
      mTimeText = (TextView) itemView.findViewById(R.id.timePlaceHolder); 
      mDegreeText = (TextView) itemView.findViewById(R.id.degreePlaceHolder); 
      mWeatherIcon = (ImageView) itemView.findViewById(R.id.weatherIconHolder); 
     } 
    } 
} 


public class HomeRecyclerAdapter extends RecyclerView.Adapter<HomeRecyclerAdapter.ViewHolder> { 
    private ArrayList<String> dates; 
    Context context; 

    public HomeRecyclerAdapter(ArrayList<String> dates) { 
     this.dates = dates; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int i) { 
     context = parent.getContext(); 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hourly_cardview, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Typeface titleStyle = Typeface.createFromAsset(context.getAssets(), 
       "font/Roboto-Medium.ttf"); 
     holder.mDate.setTypeface(titleStyle); 
     holder.mDate.setText(dates.get(position)); 
    } 

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

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     private TextView mDate; 

     ViewHolder(View view) { 
      super(view); 
      mDate = (TextView) view.findViewById(R.id.tvDate); 
     } 
    } 
} 

回答

0

您无法使用findViewById获取外部RecyclerView的适配器中的视图。在HomeRecyclerAdapter中启动子RecyclerView可以解决这个问题。

这样

```

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
               int viewType) { 
    gridLayoutManager = new GridLayoutManager(getApplicationContext(), 4); 

    RecyclerView recyclerView = (RecyclerView) LayoutInflater.from(parent.getContext()) 
          .inflate(R.layout. hourlyRecycler, parent, false); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(gridLayoutManager); 
    RecyclerView.Adapter adapter = new HourlyForcastAdapter(getApplicationContext(), listItem); 
    recyclerView.setAdapter(mAdapter);  

    // or move above code into ViewHolder 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

```

+0

我该如何去调用第一个适配器中的第二个RecyclerView?我会这样做onCreatViewHolder(如果是这样我怎么调用另一个布局来膨胀)? –

+0

所以我做了同样的事情,但把它放在onBindViewHolder中。有什么区别吗?你为我工作,但我在onBindViewHolder中做了什么。一个人比另一个人更好,如果是的话,为什么?或者没有关系? –

+0

onCreateViewHolder仅在ViewHolder首次创建时调用一次,因此inflater布局或新的某个实例在此; onBindViewHolder在每次此视图持有者应该更新时调用,所以setText或setImage在此处更新此ViewHolder。 –

0

试试这个。

在您的主适配器中,在您的主适配器中初始化构造函数中的小时循环器视图,然后创建您的外部适配器,在onBindviewHolder中使用当前cardview的位置访问recyclerview然后设置适配器。

+0

凡在第一个RecyclerView或第二个?第二个我需要一个网格视图来表示我希望如何显示数据。 –

+0

尝试第一个。我想我可能知道这个问题 – Remario

+0

我做了//RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context); LinearLayoutManager layoutManager = new LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false);并得到了相同的结果,null为第二个回收站 –

0

必须调用findViewById的转接器内的子回收视图,并把它在视图架

相关问题