Eu tenho uma atividade com a RecyclerView
e an ImageView
. Estou usando o RecyclerView
para mostrar uma lista de imagens horizontalmente. Quando eu clicar em uma imagem na RecyclerView
do ImageView
na atividade deve mostrar um quadro maior da imagem. Até agora tudo funciona bem.
Agora, existem mais dois ImageButtons
na atividade: imageButton_left
e imageButton_right
. Quando clico em imageButton_left
, a imagem no ImageView
deve virar à esquerda e a miniatura no RecyclerView
deve refletir essa alteração. Semelhante é o caso com imageButton_right
.
Eu sou capaz de girar o ImageView
. Mas, como posso girar a miniatura no RecyclerView
? Como posso obter os ViewHolder
's ImageView
?
Código:
XML da atividade:
<?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>
Código da minha atividade:
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);
}
}
Meu 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());
}
}
}
Respostas:
Suponho que você esteja usando a
LinearLayoutManager
para mostrar a lista. Ele tem um bom método chamadofindViewByPosition
queTudo o que você precisa é a posição do adaptador do item em que está interessado.
edit : como observado por Paul Woitaschek nos comentários,
findViewByPosition
é um métodoLayoutManager
para trabalhar com todos os LayoutManagers (por exemploStaggeredGridLayoutManager
, etc.)fonte
LayoutManager
para que isso funcione para todas as subclasses de LayoutManager.Isto é o que você está procurando .
Eu tive esse problema também. E como você, a resposta é muito difícil de encontrar. Mas existe uma maneira fácil de obter o ViewHolder de uma posição específica (algo que você provavelmente fará muito no adaptador).
myRecyclerView.findViewHolderForAdapterPosition(pos);
NOTA: Se a Vista tiver sido reciclada, isso retornará
null
. Agradeço a Michael por captar rapidamente minha importante omissão.fonte
ViewHolder
você está tentando fazer referência foi "reciclado", ele retornaránull
.Se você quiser
View
, não deixe de acessar aitemView
propriedade do ViewHolder da seguinte forma:myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;
fonte
Você pode usar os dois
recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition)
erecyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)
. Certifique-se de que a exibição RecyclerView use dois tipos de posiçõesPosição do adaptador: posição de um item no adaptador. Esta é a posição da perspectiva do adaptador. Posição do layout: posição de um item no último cálculo de layout. Esta é a posição da perspectiva do LayoutManager. Você deve usar
getAdapterPosition()
parafindViewHolderForAdapterPosition(adapterPosition)
egetLayoutPosition()
parafindViewHolderForLayoutPosition(layoutPosition)
.Pegue uma variável de membro para manter a posição do item selecionado anteriormente no adaptador de revisão de reciclagem e outra variável de membro para verificar se o usuário está clicando pela primeira vez ou não.
Código de amostra e capturas de tela estão anexados para obter mais informações na parte inferior.
}
fonte
Você pode criar o ArrayList do ViewHolder:
e todas as lojas ViewHolder (s) na lista, como:
e adicione / remova outro ViewHolder no ArrayList conforme sua exigência.
fonte
Você pode obter uma visão de uma posição específica em uma revisão de reciclagem usando o seguinte
fonte
Você pode simplesmente usar " findViewHolderForAdapterPosition método " " da visualização do reciclador e você obterá um objeto viewHolder a partir dele e depois converterá esse visualizador no visualizador do adaptador para poder acessar diretamente as visualizações do visualizador.
a seguir está o código de exemplo para o kotlin
fonte
Lembre-se de que você precisa aguardar até que o adaptador seja adicionado à lista e tentar obter a visualização por posição
fonte
Para obter uma View de uma posição específica de recyclerView, é necessário chamar findViewHolderForAdapterPosition (position) no objeto recyclerView que retornará RecyclerView.ViewHolder
do objeto RecyclerView.ViewHolder retornado com itemView, você pode acessar todas as vistas nessa posição específica
fonte
Você também pode fazer isso, pois isso ajudará quando você desejar modificar uma exibição depois de clicar em um item de posição de reciclagem.
fonte
Para obter uma visualização específica da lista de visualizações da recicladora OU mostre um erro no edittext da visualização da recicladora.
fonte