Tengo una actividad con un RecyclerView y un ImageView. Yo estoy usando la RecyclerView para mostrar una lista de imágenes en forma horizontal. Cuando hago clic en una imagen en la RecyclerView la ImageView en la actividad debe mostrar una imagen más grande de la imagen. Hasta el momento todo funciona bien.

Ahora hay dos más ImageButtons en la actividad: imageButton_left y imageButton_right. Cuando hago clic en imageButton_left, la imagen en la ImageView debe girar a la izquierda y también, de la miniatura en el RecyclerView debe reflejar este cambio. Similar es el caso con imageButton_right.

Soy capaz de rotar el ImageView. Pero, ¿cómo puedo rotar la imagen en miniatura en la RecyclerView? ¿Cómo puedo obtener el ViewHolder‘s ImageView?

Código:

Actividad XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/original_image"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:scaleType="fitXY"
            android:src="@drawable/image_not_available_2" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center_horizontal"
            android:orientation="horizontal">


            <ImageButton
                android:id="@+id/imageButton_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="20dp"
                android:background="@drawable/rotate_left_icon" />

            <ImageButton
                android:id="@+id/imageButton_right"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/rotate_right_icon" />

        </LinearLayout>
    </LinearLayout>
</LinearLayout>

Mi Código De La Actividad:

public class SecondActivity extends AppCompatActivity implements IRecyclerViewClickListener {
RecyclerView mRecyclerView;
LinearLayoutManager mLayoutManager;
RecyclerViewAdapter mRecyclerViewAdapter;
List<String> urls = new ArrayList<String>();
ImageView mOriginalImageView;
ImageButton mLeftRotate, mRightRotate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
urls.clear();
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mLayoutManager = new LinearLayoutManager(this, android.support.v7.widget.LinearLayoutManager.HORIZONTAL, false);
mLayoutManager.setOrientation(android.support.v7.widget.LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerViewAdapter = new RecyclerViewAdapter(this, urls);
mRecyclerView.setAdapter(mRecyclerViewAdapter);
mOriginalImageView = (ImageView) findViewById(R.id.original_image);
mLeftRotate = (ImageButton) findViewById(R.id.imageButton_left);
mLeftRotate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOriginalImageView.setRotation(mOriginalImageView.getRotation() - 90);
}
});
mRightRotate = (ImageButton) findViewById(R.id.imageButton_right);
mRightRotate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOriginalImageView.setRotation(mOriginalImageView.getRotation() + 90);
}
});
Intent intent = getIntent();
if (intent != null) {
String portfolio = intent.getStringExtra("portfolio");
try {
JSONArray jsonArray = new JSONArray(portfolio);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String url = jsonObject.getString("url");
urls.add(url);
}
Log.d(Const.DEBUG, "URLs: " + urls.toString());
mRecyclerViewAdapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onItemClick(int position) {
Picasso.with(this).load(urls.get(position)).into(mOriginalImageView);
}
}

Mi Adaptador Personalizado para RecyclerView:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
Context context;
List<String> mUrls = new ArrayList<String>();
IRecyclerViewClickListener mIRecyclerViewClickListener;
public int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public RecyclerViewAdapter(Context context, List<String> urls) {
this.context = context;
this.mUrls.clear();
this.mUrls = urls;
Log.d(Const.DEBUG, "Urls Size: " + urls.size());
Log.d(Const.DEBUG, urls.toString());
if (context instanceof IRecyclerViewClickListener)
mIRecyclerViewClickListener = (IRecyclerViewClickListener) context;
else
Log.d(Const.DEBUG, "Implement IRecyclerViewClickListener in Activity");
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_horizontal_recyclerview, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Picasso.with(context).load(mUrls.get(position)).into(holder.mImageView);
}
@Override
public int getItemCount() {
return mUrls.size();
}
public void rotateThumbnail() {
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView mImageView;
public View v;
public ViewHolder(View v) {
super(v);
v.setTag(getAdapterPosition());
v.setOnClickListener(this);
this.mImageView = (ImageView) v.findViewById(R.id.image);
}
@Override
public void onClick(View v) {
this.v = v;
mIRecyclerViewClickListener.onItemClick(getAdapterPosition());
}
}
}
  • Usted debe hacer en su viewHolder constructor, agregar una propiedad que le dirá si la imagen necesita ser girado, a continuación, sólo cambia que la propiedad sobre sus datos y llamar a notifyDataSetChanged para hacer el recyclerView de recarga
  • ¿Alguna de las respuestas a resolver su problema?
  • ViewHolder debe ser estático para el problema de rendimiento. Todas las variables de la clase exterior debe pasar a través del constructor.
  • Como un suplemento a @Scott respuestas, haga Clic en here
InformationsquelleAutor Vamsi Challa | 2015-11-18

10 Comentarios

  1. 125

    Supongo que usted está usando un LinearLayoutManager para mostrar la lista. Tiene un buen método llamado findViewByPosition que

    Encuentra a la vista de lo que representa el adaptador dado la posición.

    Todo lo que necesita es la posición del adaptador del artículo que te interesa.

    editar: como señaló Pablo Woitaschek en los comentarios, findViewByPosition es un método de LayoutManager por lo que sería trabajar con todos los LayoutManagers (es decir,StaggeredGridLayoutManager, etc.)

    • Eso, en realidad es un método de la LayoutManager así que esto va a funcionar para todos los LayoutManager subclases.
    • Miró el código fuente. LinearLayoutManger busca a través de directAccess en el respaldo de la matriz cuando no prelayout, mientras que el recyclerView método siempre hace el recorrido de la misma. Por lo que este método es probablemente más eficiente.
    • Hey @stanO puede usted por favor me ayude con este stackoverflow.com/questions/49952965/…
    • Devuelve: Ver–El niño de la vista que representa la posición dada o null si la posición no es presentado… recyclerview –> la mayoría de las cosas devolver null
    • Tenga en cuenta que usted tiene que esperar hasta que el adaptador se agrega a la lista, véase mi respuesta a continuación para obtener más detalles
  2. 204

    Esto es lo que estás buscando.

    He tenido este problema también. Y como usted, la respuesta es muy difícil de encontrar. Pero hay una manera fácil de obtener el ViewHolder desde una posición específica (algo que probablemente va a hacer mucho en el Adaptador).

    myRecyclerView.findViewHolderForAdapterPosition(pos);

    NOTA: Si la Vista ha sido reciclado, este volverá null. Gracias a Michael por la rapidez de la captura de mi importante omisión.

    • Esto es exactamente lo que yo estaba buscando en el LayoutManager
    • Esto funciona, sin embargo, si el ViewHolder usted está tratando de referencia fue el «reciclado», volverá null.
    • buena captura! Esa es una advertencia para todos ustedes por ahí, prueba null primera (sí, como todo lo demás en Android)!
    • Podemos hacer esto desde el interior del adaptador?
    • Usted puede usar este de cualquier cosa que pueda acceder a la RecyclerView instancia.
    • ¿hay alguna manera de acceder a los niños que todavía no se muestra o visible ?
    • Los niños que no son visibles en realidad no existen en el mundo de la RecyclerViews. El onBindViewHolder() se llama una vez que la Vista se va a mostrarse, que es lo mejor que puede hacer. Para acceder a los niños, usted tendrá que hacer manualmente atravesar la jerarquía, como de costumbre. Así que es de largo aliento manera de decir, «No que yo sepa.»
    • Como un suplemento a @Scott respuestas, haga Clic en aquí
    • Para aquellos que están luchando para encontrar RecycledViews tienda de los titulares en la Lista. Eche un vistazo a esta respuesta stackoverflow.com/a/49554028/6549598

  3. 20

    Si quieres la View, asegúrese de tener acceso a la itemView propiedad de la ViewHolder así: myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;

  4. 11

    Puede utilizar tanto

    recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition) y
    recyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition).
    Asegúrese de que RecyclerView utiliza dos tipos de posiciones

    Adaptador de posición : la Posición de un elemento en el adaptador. Esta es la posición del Adaptador de la perspectiva.
    Diseño de la posición : la Posición de un elemento en el más reciente diseño de cálculo. Esta es la posición de la LayoutManager perspectiva.
    Usted debe utilizar getAdapterPosition() para findViewHolderForAdapterPosition(adapterPosition) y getLayoutPosition() para findViewHolderForLayoutPosition(layoutPosition).

    Tomar una variable miembro para contener elemento seleccionado anteriormente posición en recyclerview adaptador y otro variable miembro para comprobar si el usuario hace clic por primera vez o no.

    Código de ejemplo y las capturas de pantalla están conectados para obtener más información en la parte inferior.

    public class MainActivity extends AppCompatActivity {     
    private RecyclerView mRecyclerList = null;    
    private RecyclerAdapter adapter = null;    
    @Override    
    protected void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.activity_main);    
    mRecyclerList = (RecyclerView) findViewById(R.id.recyclerList);    
    }    
    @Override    
    protected void onStart() {    
    RecyclerView.LayoutManager layoutManager = null;    
    String[] daysArray = new String[15];    
    String[] datesArray = new String[15];    
    super.onStart();    
    for (int i = 0; i < daysArray.length; i++){    
    daysArray[i] = "Sunday";    
    datesArray[i] = "12 Feb 2017";    
    }    
    adapter = new RecyclerAdapter(mRecyclerList, daysArray, datesArray);    
    layoutManager = new LinearLayoutManager(MainActivity.this);    
    mRecyclerList.setAdapter(adapter);    
    mRecyclerList.setLayoutManager(layoutManager);    
    }    
    }    
    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyCardViewHolder>{          
    private final String TAG = "RecyclerAdapter";        
    private Context mContext = null;        
    private TextView mDaysTxt = null, mDateTxt = null;    
    private LinearLayout mDateContainerLayout = null;    
    private String[] daysArray = null, datesArray = null;    
    private RecyclerView mRecyclerList = null;    
    private int previousPosition = 0;    
    private boolean flagFirstItemSelected = false;    
    public RecyclerAdapter(RecyclerView mRecyclerList, String[] daysArray, String[] datesArray){    
    this.mRecyclerList = mRecyclerList;    
    this.daysArray = daysArray;    
    this.datesArray = datesArray;    
    }    
    @Override    
    public MyCardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    
    LayoutInflater layoutInflater = null;    
    View view = null;    
    MyCardViewHolder cardViewHolder = null;    
    mContext = parent.getContext();    
    layoutInflater = LayoutInflater.from(mContext);    
    view = layoutInflater.inflate(R.layout.date_card_row, parent, false);    
    cardViewHolder = new MyCardViewHolder(view);    
    return cardViewHolder;    
    }    
    @Override    
    public void onBindViewHolder(MyCardViewHolder holder, final int position) {    
    mDaysTxt = holder.mDaysTxt;    
    mDateTxt = holder.mDateTxt;    
    mDateContainerLayout = holder.mDateContainerLayout;    
    mDaysTxt.setText(daysArray[position]);    
    mDateTxt.setText(datesArray[position]);    
    if (!flagFirstItemSelected){    
    mDateContainerLayout.setBackgroundColor(Color.GREEN);    
    flagFirstItemSelected = true;    
    }else {    
    mDateContainerLayout.setBackground(null);    
    }    
    }    
    @Override    
    public int getItemCount() {    
    return daysArray.length;    
    }    
    class MyCardViewHolder extends RecyclerView.ViewHolder{    
    TextView mDaysTxt = null, mDateTxt = null;    
    LinearLayout mDateContainerLayout = null;    
    LinearLayout linearLayout = null;    
    View view = null;    
    MyCardViewHolder myCardViewHolder = null;    
    public MyCardViewHolder(View itemView) {    
    super(itemView);    
    mDaysTxt = (TextView) itemView.findViewById(R.id.daysTxt);    
    mDateTxt = (TextView) itemView.findViewById(R.id.dateTxt);    
    mDateContainerLayout = (LinearLayout) itemView.findViewById(R.id.dateContainerLayout);    
    mDateContainerLayout.setOnClickListener(new View.OnClickListener() {    
    @Override    
    public void onClick(View v) {    
    LinearLayout linearLayout = null;    
    View view = null;    
    if (getAdapterPosition() == previousPosition){    
    view = mRecyclerList.findViewHolderForAdapterPosition(previousPosition).itemView;    
    linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);    
    linearLayout.setBackgroundColor(Color.GREEN);    
    previousPosition = getAdapterPosition();    
    }else {    
    view = mRecyclerList.findViewHolderForAdapterPosition(previousPosition).itemView;    
    linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);    
    linearLayout.setBackground(null);    
    view = mRecyclerList.findViewHolderForAdapterPosition(getAdapterPosition()).itemView;    
    linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);    
    linearLayout.setBackgroundColor(Color.GREEN);    
    previousPosition = getAdapterPosition();    
    }    
    }    
    });    
    }    
    }       

    }
    RecyclerView - Obtener la vista, en particular la posición de
    RecyclerView - Obtener la vista, en particular la posición de
    RecyclerView - Obtener la vista, en particular la posición de

    • Y pensé que este debate estaba agotado! Gracias por aclarar este tema.
    • Aquí estoy obteniendo el NullPointer excepción en el bloque else cuando estoy tratando de cambiar el color de los elementos anteriores, así que he añadido la verificación null, ahora es no entrar nunca en ese bloque, si es que tiene NullPointer excepción, por lo que el elemento anterior de color no se cambia nunca. ahora mi Reciclador de vista tiene elementos con múltiples elementos color. ¿cómo puedo resolver esto
  5. 5

    Usted puede hacer ArrayList de ViewHolder :

     ArrayList<MyViewHolder> myViewHolders = new ArrayList<>();
    ArrayList<MyViewHolder> myViewHolders2 = new ArrayList<>();

    y, todos los de la tienda ViewHolder(s) en la lista como :

     @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
    final String str = arrayList.get(position);
    myViewHolders.add(position,holder);
    }

    y agregar o quitar otros ViewHolder en el ArrayList como por su exigencia.

    • Gracias me para el estado luchando para conseguir reciclado de los titulares de como 2 días.
  6. 4

    Usted puede obtener una vista para una posición determinada en una recyclerview utilizando la siguiente

    int position = 2;
    RecyclerView.ViewHolder viewHolder = recyclerview.findViewHolderForItemId(position);
    View view = viewHolder.itemView;
    ImageView imageView = (ImageView)view.findViewById(R.id.imageView);
  7. 3

    Tenga en cuenta que usted tiene que esperar hasta que el adaptador se agrega a la lista, entonces usted puede tratar de conseguir ver por la posición

    final int i = 0;
    recyclerView.setAdapter(adapter);
    recyclerView.post(new Runnable() {
    @Override
    public void run() {
    View view = recyclerView.getLayoutManager().findViewByPosition(i);
    }
    });
  8. 2

    Usted puede usar simplemente «findViewHolderForAdapterPosition» método de reciclado de vista y obtendrá una viewHolder objeto de que, a continuación, convertir que viewholder en su adaptador viewholder así que usted puede tener acceso directamente a su viewholder opiniones

    siguiente es el código de ejemplo para kotlin

     val viewHolder = recyclerView.findViewHolderForAdapterPosition(position)
    val textview=(viewHolder as YourViewHolder).yourTextView
  9. 1

    Así usted puede hacer esto, esto será de ayuda cuando se quiere modificar una vista después de hacer clic en un recyclerview posición del elemento

    @Override
    public void onClick(View view, int position) {
    View v =  rv_notifications.getChildViewHolder(view).itemView;
    TextView content = v.findViewById(R.id.tv_content);
    content.setText("Helloo");
    }
  10. 0

    Para obtener la perspectiva específica de reciclador de la vista de lista O mostrar el error en el edittext de reciclador de vista.

    private void popupErrorMessageAtPosition(int itemPosition) {
    RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(itemPosition);
    View view = viewHolder.itemView;
    EditText etDesc = (EditText) view.findViewById(R.id.et_description);
    etDesc.setError("Error message here !");
    }

Dejar respuesta

Please enter your comment!
Please enter your name here