Estoy usando RecyclerView.Adaptador pero estoy algo confundido sobre el trabajo de su método onCreateViewHolder.

  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    if(viewType==TYPE_ITEM) {

        View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.inflate_common_item, viewGroup, false);
        ViewHolder vh = new ViewHolder(mView);
        return vh;

    } else {
        View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.inflate_uncommon_item, viewGroup, false);
        ViewHolderFooter vh = new ViewHolderFooter(mView);
        return vh;

    }
}

Por lo que en caso que me tiene 10 artículos en mi lista así que para cada elemento de este método será llamado cada vez que una nueva ViewHolder será creado por supuesto te de una sola vez para cada vista, pero ahora mi pregunta es cuando utilizamos ListView y BaseAdapter con ellos almacenamos ViewHolder en la etiqueta y el uso que. No creamos ViewHolder para cada elemento.

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            MyViewHolder mViewHolder;

            if(convertView == null) {
                    convertView = inflater.inflate(R.layout.layout_list_item, null);
                    mViewHolder = new MyViewHolder();
                    convertView.setTag(mViewHolder);
            } else {
                    mViewHolder = (MyViewHolder) convertView.getTag();
            }

            mViewHolder.tvTitle = detail(convertView, R.id.tvTitle, myList.get(position).getTitle());
            mViewHolder.tvDesc  = detail(convertView, R.id.tvDesc,  myList.get(position).getDescription());
            mViewHolder.ivIcon  = detail(convertView, R.id.ivIcon,  myList.get(position).getImgResId());

            return convertView;
    }

Así que no estamos creando más viewholders objeto. Por favor, que me ayude a entender los pros y los contras.

Gracias

OriginalEl autor Ankur Chaudhary | 2015-06-03

2 Comentarios

  1. 19

    onCreateViewHolder sólo crea una nueva vista de titular cuando no existen vista de los titulares que la RecyclerView puede reutilizar. Así, por ejemplo, si su RecyclerView puede mostrar 5 elementos a la vez, se creará 5-6 ViewHolders y, a continuación, automáticamente la reutilización de ellos, cada vez de llamar a onBindViewHolder.

    Su similar a lo que su código en el ListView no (verificar si convertView es null, y si no, el acaparamiento de la existente ViewHolder de la etiqueta), excepto, con RecyclerView, todo esto se hace automáticamente.

    Supongo que esta es una de las ventajas con el uso de un RecyclerView – usted no tiene que preocuparse mucho acerca de la reutilización de ViewHolders como lo hace con ListView. La estafa es, RecyclerView es muy personalizable, pero tiene muy poco construido en la funcionalidad – a diferencia de ListView que no es muy personalizable, pero tiene un montón de construido en la funcionalidad.

    Así que eso significa que va a generar un viewholder para cada elemento y, a continuación, el uso que el titular de cada tiempo para que la celda de la lista. a la derecha?
    Gracias Gil, tengo una pregunta más en RecyclerView.Adaptador pero para que voy a poner una pregunta aparte de desbordamiento de pila.
    he ido a través de algunos documentos que se mencionan para el método abstracto onCreateViewHolder. El nuevo ViewHolder será utilizado para mostrar los elementos de que el adaptador se utiliza {@link #onBindViewHolder(ViewHolder, int)}. Ya que va a ser re-utilizado para mostrar los diferentes elementos en el conjunto de datos, es una buena idea para almacenar en caché las referencias a la sub vistas de la Vista, para evitar la innecesaria {@link Ver#findViewById(int)} llamadas. Entonces, ¿cómo podemos caché de referencias a los sub puntos de vista?
    Su ViewHolder debería estar haciendo esto. Cuando un ViewHolder se crea, se hace una referencia a la vista principal de su participación en el constructor. Entonces, personalizado ViewHolder debe tomar todas las subvistas (etiquetas, imágenes, etc), incluso en el método constructor. Recuerde que un ViewHolder sólo se crea cuando no existe ViewHolder a la reutilización, y por lo que la creación de Vistas, se sigue la misma lógica.
    Ahora mismo estoy de iniciar mi subvista en el constructor público ViewHolder(View v) { super(v); mTvSectionName = (TextView)v. findViewById(R. id.tvName); } por Lo tanto significa que mi textview deben ser inicializadas sólo una vez, pero cuando estoy depurando pasando a cada momento en el constructor de ViewHolder para iniciar mi textview. Es la manera correcta?

    OriginalEl autor Gil Moshayof

  2. 0

    Usted puede utilizar esta :

    –> Crear un constructor :

    /**
    * Creado por Deepak Sharma en 31/10/17.
    */

    public class StoreListAdapter<T> extends RecyclerView.Adapter<StoreListAdapter.ViewHolder> implements Filterable {
    private Collection<T> mItems;
    private Context context;
    private int mLayout;
    IClickable iClickable;
    private boolean isAnimationAllowed;
    private StoreSearchFilter<T> mSearchFilter;
    public StoreListAdapter(Context context)
    {
    this.context = context;
    }
    public void setData(Collection<T> items, boolean isAnimationAllowed)
    {
    mItems = items;
    this.isAnimationAllowed = isAnimationAllowed;
    }
    public void setCallback(int layout, IClickable iClickable)
    {
    this.mLayout = layout;
    this.iClickable = iClickable;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(mLayout, viewGroup, false);
    iClickable.init(view);
    StoreListAdapter.ViewHolder viewHolder = new StoreListAdapter.ViewHolder(view);    
    view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
    //       viewHolder.itemView.getLayoutParams().width = width;
    viewHolder.itemView.getLayoutParams().height = height+24;
    return viewHolder;
    }
    @Override
    public void onBindViewHolder(StoreListAdapter.ViewHolder viewHolder, int i) {
    iClickable.execute(viewHolder, mItems.toArray()[i],viewHolder.getAdapterPosition());
    if (isAnimationAllowed)
    setAnimation(viewHolder.itemView, i);
    }
    @Override
    public int getItemCount() {
    return mItems.size()>0?mItems.size():0;
    }
    @Override
    public Filter getFilter() {
    if (mSearchFilter == null)
    mSearchFilter = new StoreSearchFilter<T>((ArrayList<StoreModel>) mItems, new IFilteredList<T>() {
    @Override
    public void onListFiltered(ArrayList<T> list) {
    setData(list, false);
    notifyDataSetChanged();
    }
    });
    return mSearchFilter;
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
    private final TextView mTextView;
    //private CheckBox mCheckBox;
    ViewHolder(View v) {
    super(v);
    mTextView = (TextView)v.findViewById(R.id.list_item);
    //Handle item click and set the selection
    /*v.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //Redraw the old selection and the new
    notifyItemChanged(selectedItem);
    selectedItem = getLayoutPosition();
    notifyItemChanged(selectedItem);
    }
    });*/
    }
    }
    public interface IClickable<T> {
    public void init(View view);
    public void execute(StoreListAdapter.ViewHolder holder, T object, int position);
    }
    /**
    * Here is the key method to apply the animation
    */
    private void setAnimation(View viewToAnimate, int position)
    {
    Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
    viewToAnimate.startAnimation(animation);
    }
    }

    –> En la Actividad/Fragmento :

    ArrayList<StoreModel> mStoreList = new ArrayList<>();
    mStoreListAdapter = new StoreListAdapter(getActivity());
    boolean isAnimate = false;
    mStoreListAdapter.setData(mStoreList, isAnimate);

    luego de la llamada de devolución de llamada

    mStoreListAdapter.setCallback(R.layout.store_item, new StoreListAdapter.IClickable() {
    @Override
    public void init(View view) {
    //   Toast.makeText(getActivity(), "Initialized", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void execute(StoreListAdapter.ViewHolder viewHolder, Object object, int position) {
    final StoreModel model = (StoreModel) object;
    View view = viewHolder.itemView;
    StoreListAdapter.ViewHolder holder = viewHolder;
    final CoordinatorLayout fabGameview = (CoordinatorLayout) view;
    final CardView cardView = (CardView) fabGameview.findViewById(R.id.store_item_cardview);
    TextView txtStoreName = (TextView) cardView.findViewById(R.id.txtStoreName);
    TextView txtStoreAddress = (TextView) cardView.findViewById(R.id.txtStoreAddress);
    TextView txtStoreCity = (TextView) cardView.findViewById(R.id.txtStoreCity);
    TextView txtPrizes = (TextView) cardView.findViewById(R.id.txtPrizes);
    txtStoreName.setText(model.getStoreName());
    txtStoreAddress.setText(model.getStoreAddress());
    txtStoreCity.setText(model.getStoreCity());
    txtPrizes.setText(String.valueOf(model.getPrizesAvailable()));
    LinearLayout linearDetails = (LinearLayout) cardView.findViewById(R.id.linearDetails);
    LinearLayout linearPrize = (LinearLayout) cardView.findViewById(R.id.linearPrize);
    if (clickedMarkerModel != null && clickedMarkerModel == model) {
    holder.itemView.setSelected(true);
    //                   holder.itemView.setPressed(true);
    //                   linearDetails.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
    //                   linearPrize.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
    //                   mRecyclerStore.stopScroll();
    } else {
    holder.itemView.setSelected(false);
    //                   holder.itemView.setPressed(false);
    //                   linearDetails.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.store_selector));
    //                   linearPrize.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.store_selector));
    }
    //TODO Here scroll recycler view upto selected item
    /*mRecyclerStore.smoothScrollToPosition(mStoreListAdapter.getItemCount() - 1);*/
    cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    boolean isAddedToBackStack = true;
    StoreDetailsAndProductListFragment storeDetailsAndProductListFragment = new StoreDetailsAndProductListFragment();
    Bundle bundle = new Bundle();
    bundle.putParcelable(ExtrasUtil.STORE, model);
    storeDetailsAndProductListFragment.setArguments(bundle);
    showOtherFragment(storeDetailsAndProductListFragment, getActivity().getFragmentManager(), isAddedToBackStack);
    }
    });
    }
    });
    mRecyclerStore.setAdapter(mStoreListAdapter);

    OriginalEl autor Maddy

Dejar respuesta

Please enter your comment!
Please enter your name here