J'ai une activité avec un RecyclerView
et un ImageView
. J'utilise RecyclerView
pour afficher une liste d'images horizontalement. Lorsque je clique sur une image dans leRecyclerView
la ImageView
dans l'activité devrait afficher une image plus grande de l'image. Jusqu'à présent, tout fonctionne bien.
Maintenant, il y en a deux autres ImageButtons
dans l'activité: imageButton_left
et imageButton_right
. Lorsque je clique sur imageButton_left
, l'image dans le ImageView
doit tourner à gauche et aussi, la vignette dans le RecyclerView
doit refléter ce changement. Le cas est similaire avec imageButton_right
.
Je peux faire pivoter le fichier ImageView
. Mais, comment puis-je faire pivoter la vignette dans le RecyclerView
? Comment puis-je obtenir les ViewHolder
's ImageView
?
Code:
XML d'activité:
<?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>
Mon code d'activité:
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);
}
}
Mon adaptateur personnalisé pour 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());
}
}
}
Réponses:
Je suppose que vous utilisez un
LinearLayoutManager
pour afficher la liste. Il a une belle méthode appeléefindViewByPosition
çaTout ce dont vous avez besoin est la position de l'adaptateur de l'article qui vous intéresse.
edit : comme indiqué par Paul Woitaschek dans les commentaires,
findViewByPosition
est une méthodeLayoutManager
pour qu'elle fonctionne avec tous les LayoutManagers (c'estStaggeredGridLayoutManager
-à- dire , etc.)la source
LayoutManager
donc cela fonctionnera pour toutes les sous-classes de LayoutManager.C'est ce que vous recherchez .
J'ai eu ce problème également. Et comme vous, la réponse est très difficile à trouver. Mais il existe un moyen simple d'obtenir le ViewHolder à partir d'une position spécifique (ce que vous ferez probablement beaucoup dans l'adaptateur).
myRecyclerView.findViewHolderForAdapterPosition(pos);
REMARQUE: si la vue a été recyclée, elle reviendra
null
. Merci à Michael d'avoir rapidement compris mon importante omission.la source
ViewHolder
vous essayez de référencer était «recyclé», il reviendranull
.Si vous le souhaitez
View
, assurez-vous d'accéder à laitemView
propriété de ViewHolder comme suit:myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;
la source
Vous pouvez utiliser les deux
recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition)
etrecyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)
. Assurez-vous que la vue RecyclerView utilise deux types de positionsPosition de l'adaptateur: position d'un élément dans l'adaptateur. C'est la position du point de vue de l'adaptateur. Position de mise en page: position d'un élément dans le dernier calcul de mise en page. Il s'agit de la position du point de vue du LayoutManager. Vous devez utiliser
getAdapterPosition()
pourfindViewHolderForAdapterPosition(adapterPosition)
etgetLayoutPosition()
pourfindViewHolderForLayoutPosition(layoutPosition)
.Prenez une variable membre pour conserver la position d'élément précédemment sélectionnée dans l'adaptateur recyclerview et une autre variable membre pour vérifier si l'utilisateur clique pour la première fois ou non.
Des exemples de code et des captures d'écran sont joints pour plus d'informations en bas.
}
la source
Vous pouvez créer ArrayList de ViewHolder:
et, tous stockent ViewHolder (s) dans la liste comme:
et ajoutez / supprimez d'autres ViewHolder dans la ArrayList selon vos besoins.
la source
Vous pouvez obtenir une vue pour une position particulière sur une vue de recyclage en utilisant les éléments suivants
la source
Vous pouvez simplement utiliser " findViewHolderForAdapterPosition méthode " de la vue recycleur et vous obtiendrez un objet viewHolder à partir de celui-ci puis transposez cette visionneuse dans la visionneuse de votre adaptateur afin que vous puissiez accéder directement aux vues de votre visionneuse
voici l'exemple de code pour kotlin
la source
Gardez à l'esprit que vous devez attendre que l'adaptateur soit ajouté à la liste, vous pouvez alors essayer d'obtenir vue par position
la source
Pour obtenir une vue à partir d'une position spécifique de recyclerView, vous devez appeler findViewHolderForAdapterPosition (position) sur l'objet recyclerView qui renverra RecyclerView.ViewHolder
à partir de l'objet RecyclerView.ViewHolder renvoyé avec itemView, vous pouvez accéder à toutes les vues à cette position particulière
la source
Vous pouvez également le faire, cela vous aidera lorsque vous souhaitez modifier une vue après avoir cliqué sur un élément de position de la vue de recyclage
la source
Pour obtenir une vue spécifique à partir de la liste des vues du recycleur OU afficher une erreur à edittext de la vue du recycleur.
la source