2015-06-08 2 views
0

Я пытаюсь добавить два разных вида в GridviewLayoutManager с помощью пользовательского адаптера.Применение и создание нескольких представлений для GridViewLayout

Однако я не могу правильно ссылаться на headerview. Когда onbindViewHolder называется он ожидает ответ «ViewHolder», однако я действительно хочу, чтобы ссылаться на HeaderView я упаковал

Потому что я не могу получить доступ к правильной точке зрения, я также не может ссылаться на TextView в макете XML я звоню.

вот мой клиент класса адаптера:

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

import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 

public class ElementsAdapter extends RecyclerView.Adapter<ElementsAdapter.ViewHolder> { 
    private ArrayList<String> mDataset; 
    private ArrayList<Integer> mDatamap; 

public Context context; 

    private static final int VIEW_HEADER = 0; 
    private static final int VIEW_NORMAL = 1; 

    private View headerView; 
    private int datasetSize; 

    public class HeaderHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView headertext; 

     public HeaderHolder(View v) { 
      super(v); 
      headertext = (TextView) v.findViewById(R.id.headertext); 
     } 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView txtHeader; 
     public TextView txtFooter; 
     public ImageView imgImage; 

     public ViewHolder(View v) { 
      super(v); 
      txtHeader = (TextView) v.findViewById(R.id.firstLine); 
      txtFooter = (TextView) v.findViewById(R.id.secondLine); 
      imgImage = (ImageView) v.findViewById(R.id.icon); 
     } 

    } 

    public ElementsAdapter(ArrayList<String> myDataset, ArrayList<Integer> myDatamap) { 
     mDataset = myDataset; 
     myDatamap = mDatamap; 
    } 


     @Override 
    public int getItemViewType(int position) { 
     return isHeader(position) == 1 ? VIEW_HEADER : VIEW_NORMAL; 
    } 

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

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == VIEW_HEADER) { 
      // create a new view 
      View sub_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false); 

      Context context = sub_view.getContext(); 

      // set the view's size, margins, paddings and layout parameters 
      ViewHolder vh = new ViewHolder(sub_view); 

      return vh; 


//   return new HeaderViewHolder(headerView); 

     } else { 
      // create a new view 
      View sub_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sub_layout, parent, false); 

      context = sub_view.getContext(); 

      // set the view's size, margins, paddings and layout parameters 
      ViewHolder vh = new ViewHolder(sub_view); 

      return vh; 


     } 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int position) { 
     if (isHeader(position) == 1) { 

      // - get element from your dataset at this position 
      // - replace the contents of the view with that element 
      final String name = mDataset.get(position); 

//  holder.txtHeader.setText(mDataset.get(position)); 
      viewHolder.headertext.setText(name); 

     } else { 

    // - get element from your dataset at this position 
    // - replace the contents of the view with that element 
    final String name = mDataset.get(position); 

    Picasso.with(context).load("http://www.500kgiveaway.co.uk/"+name).resize(200,200).into(viewHolder.imgImage); 

//  holder.txtHeader.setText(mDataset.get(position)); 
    viewHolder.txtHeader.setText(name); 

    viewHolder.txtHeader.setOnClickListener(new View.OnClickListener() 

    { 
     @Override 
     public void onClick (View v){ 
     //remove(name); 
    } 
    } 

    ); 

    viewHolder.txtFooter.setText("Footer: "+mDataset.get(position)); 
} 

     //ViewHolder holder = (ViewHolder) viewHolder; 
     //holder.textView.setText("Position " + (position - 1)); 
    } 

    public int isHeader(int position) { 
     return mDatamap.get(position) ==1 ? 1:0;} 
} 

ответ

0

Мне кажется, что метод isHeader() всегда возвращает 0, так как сравнить строку с целым числом. Я предполагаю, что вы хотели бы хотеть проверить позицию текущего элемента, чтобы быть 1.

Попробуйте этот код вместо:

public boolean isHeader(int position) { 
    return position == 1; 
} 

Затем замените

if (isHeader(position) == 1)... 

с

if (isHeader(position))... 

Надеюсь, это поможет.

Редактировать

выше было задумано. Сожалею. В определении класса ElementsAdapter.ViewHolder вставляется как тип ViewHolder. Это работает для нормального

ElementsAdapter.ViewHolder extends RecyclerView.ViewHolder 

, но не для

ElementsAdapter.HeaderHolder extends RecyclerView.ViewHolder 

, поскольку он не распространяется ElementsAdapter.ViewHolder.

Вы должны указать вместо этого RecyclerView.ViewHolder как общий тип для поддержки обоих типов.

+0

Я хотел, чтобы это искало значение в массиве MyDataMap в позиции (позиции). Если это == 1, то я хотел бы вернуть 1, если нет, то я хотел бы вернуть 0 – PowerMan2015

+0

. Затем вы захотите сначала преобразовать String в int, чтобы иметь возможность их компилировать, см. Http://stackoverflow.com/ a/4092190/4983239. Или вы можете использовать 'ArrayList ' вместо' ArrayList '. –

+0

Извините, что мое имя переменной может ввести в заблуждение. У меня есть myDataSet, который хранит данные и myDataMap, который обозначает тип представления, который должен отображаться. Есть ли у вас идеи о том, как создать второе представление? в какой момент я мог бы проверить остальную часть кода – PowerMan2015

Смежные вопросы