2016-07-11 12 views
0

Ich entwickle eine Wetter-App, in der ich zwei Ansichten innerhalb von RecyclerView verwenden wollte, die CursorAdapter als Mitglied haben. Ich möchte eine Ansicht verwenden, um das heutige Wetter und andere Ansichten anzuzeigen, um andere Wettertage anzuzeigen. Mein RecyclerView funktioniert tadellos und ich zeige sogar die zwei Layouts aber nicht richtig an, das Layout, das ich für das heutige Wetter verwenden möchte, wird von morgen Wetter und vorletzter Tag in der Liste verwendetRecyclerView zeigt heterogene Layouts nicht korrekt an

Folgendes ist der Code für meinen RecyclerView Adapter: -

public class WeatherAdapter extends RecyclerView.Adapter<WeatherAdapter.ViewHolder> { 

    private static int VIEW_TYPE_TODAY = 0; 
    private static int VIEW_TYPE_FUTURE_DAY = 1; 
    private static final int VIEW_TYPE_COUNT = 2; 
    public CursorAdapter mCursorAdapter; 
    private Context mContext; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     TextView date,weather,min,max; 
     ImageView icon; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      date =(TextView) itemView.findViewById(R.id.list_item_date_textview); 
      weather = (TextView) itemView.findViewById(R.id.list_item_forecast_textview); 
      min = (TextView) itemView.findViewById(R.id.list_item_low_textview); 
      max = (TextView) itemView.findViewById(R.id.list_item_high_textview); 
      icon = (ImageView) itemView.findViewById(R.id.list_item_icon); 
     } 
    } 



    // Provide a suitable constructor (depends on the kind of dataset) 
    public WeatherAdapter(Context context, Cursor c,int flags) { 
     mContext = context; 
     mCursorAdapter = new CursorAdapter(mContext,c,flags) { 
      @Override 
      public View newView(Context context, Cursor cursor, ViewGroup parent) { 
       int viewType = getItemViewType(cursor.getPosition()); 
       int layoutId = -1; 
       if(viewType==VIEW_TYPE_TODAY) 
        layoutId = R.layout.list_item_forecast_today; 
       else if(viewType==VIEW_TYPE_FUTURE_DAY) 
        layoutId = R.layout.list_item_forecast; 
       View view = LayoutInflater.from(context).inflate(layoutId, parent, false); 
       return view; 
      } 

      @Override 
      public void bindView(View itemView, Context context, final Cursor cursor) { 
       // our view is pretty simple here --- just a text view 
       // we'll keep the UI functional with a simple (and slow!) binding. 

       TextView date,weather,min,max; 
       ImageView icon; 

       date =(TextView) itemView.findViewById(R.id.list_item_date_textview); 
       weather = (TextView) itemView.findViewById(R.id.list_item_forecast_textview); 
       min = (TextView) itemView.findViewById(R.id.list_item_low_textview); 
       max = (TextView) itemView.findViewById(R.id.list_item_high_textview); 
       icon = (ImageView) itemView.findViewById(R.id.list_item_icon); 

       int weatherId = cursor.getInt(ForecastFragment.COL_WEATHER_ID); 
       icon.setImageResource(R.drawable.ic_launcher); 
       long dateId = cursor.getLong(ForecastFragment.COL_WEATHER_DATE); 
       date.setText(Utility.getDayName(mContext,dateId)); 
       String weatherDesc = cursor.getString(ForecastFragment.COL_WEATHER_DESC); 
       weather.setText(weatherDesc); 
       boolean isMetric = Utility.isMetric(mContext); 
       double high = cursor.getDouble(ForecastFragment.COL_WEATHER_MAX_TEMP); 
       max.setText(Utility.formatTemperature(high, isMetric) + "/"); 
       double low = cursor.getDouble(ForecastFragment.COL_WEATHER_MIN_TEMP); 
       min.setText(Utility.formatTemperature(low, isMetric)); 
      } 

      @Override 
      public int getViewTypeCount() { 
       return VIEW_TYPE_COUNT; 
      } 

      @Override 
      public int getItemViewType(int position) { 
       Log.e("getItemViewType: ",""+position); 
       if(position == VIEW_TYPE_TODAY) 
        return VIEW_TYPE_TODAY; 
       else 
        return VIEW_TYPE_FUTURE_DAY; 
      } 
     }; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public WeatherAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent); 
     return new ViewHolder(v); 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     mCursorAdapter.getCursor().moveToPosition(position); 
     mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor()); 
     Cursor cursor = mCursorAdapter.getCursor(); 
     cursor.moveToPosition(position); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Cursor cursor = mCursorAdapter.getCursor(); 
       cursor.moveToPosition(position); 
       if (!cursor.isClosed()) { 
        String locationSetting = Utility.getPreferredLocation(mContext); 
        Intent intent = new Intent(mContext.getApplicationContext(), DetailActivity.class) 
          .setData(WeatherContract.WeatherEntry.buildWeatherLocationWithDate(
            locationSetting, cursor.getLong(ForecastFragment.COL_WEATHER_DATE) 
          )); 
        mContext.startActivity(intent); 
       } 
      } 
     }); 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mCursorAdapter.getCount(); 
    } 


} 

ich bin nicht in der Lage, was falsch in meinem implementation.Thanks zu verstehen, in fortgeschrittenen

Antwort

0

Sie sollten auch eine getItemViewType() in WeatherAdapter haben. Sie haben es nur im CursorAdapter.

@Override 
int getItemViewType (int position) { 
    return mCursorAdapter.getItemViewType(position); 
} 
+0

aber was ist die Notwendigkeit von getItemViewType() in WeatherAdapter? –

+0

Soweit ich weiß, bestimmt der Elementtyp, ob RecyclerView die Ansicht wiederverwenden oder eine neue erstellen kann. Wenn Sie es nicht angeben, können alle Ansichten vom gleichen Typ sein. –

+0

Ok, aber wie soll ich den Elementtyp in onCreateViewHolder() verwenden? –

Verwandte Themen