Ich habe eine Aktivität mit einem RecyclerView
und einem ImageView
. Ich verwende die RecyclerView
, um eine Liste von Bildern horizontal anzuzeigen. Wenn ich auf einem Bild klicken in der RecyclerView
die ImageView
in der Tätigkeit sollte ein größeres Bild des Bildes zeigen. Bisher funktioniert alles gut.
Jetzt gibt es zwei weitere ImageButtons
in der Aktivität: imageButton_left
und imageButton_right
. Wenn ich auf klicke imageButton_left
, sollte das Bild in ImageView
links abbiegen und auch das Miniaturbild in RecyclerView
sollte diese Änderung widerspiegeln. Ähnliches gilt für imageButton_right
.
Ich kann das drehen ImageView
. Aber wie kann ich das Vorschaubild in der drehen RecyclerView
? Wie kann ich die bekommen ViewHolder
‚s ImageView
?
Code:
Aktivitäts-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>
Mein Aktivitätscode:
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);
}
}
Mein benutzerdefinierter Adapter für 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());
}
}
}
Antworten:
Ich nehme an, Sie verwenden a
LinearLayoutManager
, um die Liste anzuzeigen. Es hat eine schöne Methode namensfindViewByPosition
dasSie benötigen lediglich die Adapterposition des Artikels, an dem Sie interessiert sind.
edit : wie von Paul Woitaschek in den Kommentaren erwähnt,
findViewByPosition
ist eine Methode,LayoutManager
damit es mit allen LayoutManagern (dhStaggeredGridLayoutManager
usw.) funktioniert .quelle
LayoutManager
so dass dies für alle LayoutManager-Unterklassen funktioniert.Das ist was Sie suchen .
Ich hatte auch dieses Problem. Und wie Sie ist die Antwort sehr schwer zu finden. Es gibt jedoch eine einfache Möglichkeit, den ViewHolder von einer bestimmten Position aus abzurufen (etwas, das Sie im Adapter wahrscheinlich häufig tun werden).
myRecyclerView.findViewHolderForAdapterPosition(pos);
HINWEIS: Wenn die Ansicht recycelt wurde, wird diese zurückgegeben
null
. Vielen Dank an Michael, der meine wichtige Lücke schnell erkannt hat.quelle
ViewHolder
Sie verweisen möchten, "recycelt" wurde, wird es zurückgegebennull
.Wenn Sie das möchten
View
, stellen Sie sicher, dassitemView
Sie wie folgt auf die Eigenschaft des ViewHolder zugreifen:myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;
quelle
Sie können beide verwenden
recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition)
undrecyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)
. Stellen Sie sicher, dass die RecyclerView-Ansicht zwei Arten von Positionen verwendetAdapterposition: Position eines Elements im Adapter. Dies ist die Position aus Sicht des Adapters. Layoutposition: Position eines Elements in der letzten Layoutberechnung. Dies ist die Position aus Sicht des LayoutManagers. Sie sollten
getAdapterPosition()
fürfindViewHolderForAdapterPosition(adapterPosition)
undgetLayoutPosition()
für verwendenfindViewHolderForLayoutPosition(layoutPosition)
.Nehmen Sie eine Mitgliedsvariable, um die zuvor ausgewählte Elementposition im Recyclerview-Adapter zu halten, und eine andere Mitgliedsvariable, um zu überprüfen, ob der Benutzer zum ersten Mal klickt oder nicht.
Beispielcode und Screenshots finden Sie unten für weitere Informationen.
}}
quelle
Sie können ArrayList von ViewHolder erstellen:
und alle speichern ViewHolder (s) in der Liste wie folgt:
und fügen Sie gemäß Ihrer Anforderung einen anderen ViewHolder in der ArrayList hinzu / entfernen Sie ihn.
quelle
Mithilfe der folgenden Informationen können Sie eine Ansicht für eine bestimmte Position in einer Recyclingansicht abrufen
quelle
Sie können einfach die Methode " findViewHolderForAdapterPosition " der Recycler-Ansicht verwenden, und Sie erhalten daraus ein viewHolder-Objekt. Geben Sie diesen Ansichtsinhaber dann in Ihren Adapter-Ansichtsinhaber ein, damit Sie direkt auf die Ansichten Ihres Ansichtsinhabers zugreifen können
Es folgt der Beispielcode für Kotlin
quelle
Denken Sie daran, dass Sie warten müssen, bis der Adapter zur Liste hinzugefügt wird. Dann können Sie versuchen, die Ansicht nach Position zu erhalten
quelle
Um eine Ansicht von einer bestimmten Position von recyclerView abzurufen, müssen Sie findViewHolderForAdapterPosition (position) für das recyclerView-Objekt aufrufen, das RecyclerView.ViewHolder zurückgibt
Über das zurückgegebene RecyclerView.ViewHolder-Objekt mit itemView können Sie auf alle Ansichten an dieser bestimmten Position zugreifen
quelle
Sie können dies auch tun. Dies ist hilfreich, wenn Sie eine Ansicht ändern möchten, nachdem Sie auf ein Positionselement für die Recyclingansicht geklickt haben
quelle
Um eine bestimmte Ansicht aus der Liste der Recycler-Ansichten zu erhalten, ODER zeigen Sie einen Fehler im Text der Recycler-Ansicht an.
quelle