Saya memiliki aktivitas dengan a RecyclerView
dan ImageView
. Saya menggunakan ini RecyclerView
untuk menampilkan daftar gambar secara horizontal. Ketika saya klik pada gambar di RecyclerView
dalam ImageView
aktivitas harus menunjukkan gambaran yang lebih besar dari gambar. Sejauh ini semuanya bekerja dengan baik.
Sekarang ada dua ImageButtons
kegiatan lagi: imageButton_left
dan imageButton_right
. Ketika saya mengklik imageButton_left
, gambar di ImageView
harus belok kiri dan juga, thumbnail di RecyclerView
harus mencerminkan perubahan ini. Serupa halnya dengan imageButton_right
.
Saya dapat memutar ImageView
. Tapi, bagaimana saya bisa memutar thumbnail di RecyclerView
? Bagaimana saya bisa mendapatkan ViewHolder
itu ImageView
?
Kode:
XML Kegiatan:
<?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>
Kode Aktivitas Saya:
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);
}
}
Adaptor Kustom Saya untuk 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());
}
}
}
Jawaban:
Saya kira Anda menggunakan a
LinearLayoutManager
untuk menampilkan daftar. Ini memiliki metode yang bagus yang disebutfindViewByPosition
ituYang Anda butuhkan hanyalah posisi adaptor dari item yang Anda minati.
sunting : seperti yang dicatat oleh Paul Woitaschek dalam komentar,
findViewByPosition
adalah metode untukLayoutManager
bekerja dengan semua LayoutManagers (yaituStaggeredGridLayoutManager
, dll.)sumber
LayoutManager
jadi ini akan bekerja untuk semua subclass LayoutManager.Ini yang kamu cari .
Saya punya masalah ini juga. Dan seperti Anda, jawabannya sangat sulit ditemukan. Tetapi ADA cara mudah untuk mendapatkan ViewHolder dari posisi tertentu (sesuatu yang mungkin akan Anda lakukan banyak di Adapter).
myRecyclerView.findViewHolderForAdapterPosition(pos);
CATATAN: Jika Tampilan telah didaur ulang, ini akan kembali
null
. Terima kasih kepada Michael karena cepat menangkap kelalaian penting saya.sumber
ViewHolder
Anda mencoba referensi "didaur ulang", itu akan kembalinull
.Jika Anda menginginkannya
View
, pastikan untuk mengaksesitemView
properti ViewHolder seperti:myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;
sumber
Anda bisa menggunakan keduanya
recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition)
danrecyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)
. Pastikan tampilan RecyclerView menggunakan dua jenis posisiPosisi adaptor: Posisi item dalam adaptor. Ini adalah posisi dari sudut pandang Adaptor. Posisi tata letak: Posisi item dalam perhitungan tata letak terbaru. Ini adalah posisi dari perspektif LayoutManager. Anda harus menggunakan
getAdapterPosition()
untukfindViewHolderForAdapterPosition(adapterPosition)
dangetLayoutPosition()
untukfindViewHolderForLayoutPosition(layoutPosition)
.Ambil variabel anggota untuk menahan posisi item yang sebelumnya dipilih dalam adaptor recyclerview dan variabel anggota lainnya untuk memeriksa apakah pengguna mengklik pertama kali atau tidak.
Kode contoh dan tangkapan layar dilampirkan untuk informasi lebih lanjut di bagian bawah.
}
sumber
Anda dapat membuat ArrayList dari ViewHolder:
dan, semua menyimpan ViewHolder (s) dalam daftar seperti:
dan tambahkan / hapus ViewHolder lain di ArrayList sesuai kebutuhan Anda.
sumber
Anda bisa mendapatkan tampilan untuk posisi tertentu pada recyclerview menggunakan yang berikut ini
sumber
Anda cukup menggunakan metode " findViewHolderForAdapterPosition " dari tampilan pendaur ulang dan Anda akan mendapatkan objek viewHolder dari itu lalu ketik penampil itu ke penampil adaptor Anda sehingga Anda dapat langsung mengakses pandangan penampil Anda
berikut ini adalah kode sampel untuk kotlin
sumber
Ingatlah bahwa Anda harus menunggu sampai adaptor akan ditambahkan ke daftar, maka Anda dapat mencoba untuk mendapatkan tampilan berdasarkan posisi
sumber
Untuk mendapatkan Tampilan dari posisi tertentu dari recyclerView, Anda perlu memanggil findViewHolderForAdapterPosition (posisi) pada objek recyclerView yang akan mengembalikan RecyclerView.ViewHolder
dari objek RecyclerView.ViewHolder yang dikembalikan dengan itemView Anda dapat mengakses semua Tampilan pada posisi tertentu
sumber
Anda juga dapat melakukan ini, ini akan membantu ketika Anda ingin mengubah tampilan setelah mengklik item posisi recyclerview
sumber
Untuk mendapatkan tampilan spesifik dari daftar tampilan pendaur ulang ATAU menunjukkan kesalahan di editeks tampilan pendaur ulang.
sumber