android - make - ¿Cómo obtener la vista del niño desde RecyclerView?
recyclerview in fragment (10)
Entonces, la vista de reciclaje y la información de su producto están en 2 fragmentos diferentes, ¿sí? ¿Está esperando que las vistas de recyclerview se actualicen cuando ni siquiera están en primer plano? también está cambiando los datos del elemento de datos del adaptador en la posición event.getSellRecordPosition()
, pero no está notificando al adaptador que su conjunto de datos ha cambiado, ya sea por adapter.notifyDataSetChanged()
o por los otros notifyItemChanged(position)
.
Yo modificaría tu onEvent () así:
@Subscribe
public void onEvent(SellRecordChangedEvent event){
sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord());
sell.recalculate();
int position = event.getSellRecordPosition();
MyViewHolder holder = adapter.onCreateViewHolder(yourRecyclerView, 0);
adapter.onBindViewHolder(holder,position);
View view = adapter.getView(position);
bus.post(new TransactionTitleChangedEvent(null, view));
}
Llamar a createViewHolder y al siguiente BindViewHolder en su adaptador definitivamente actualizará las vistas para esa posición, entonces su adapter.getView (posición) debería devolverle la última vista.
Aquí MyViewHolder es su clase de viewholder y suRecyclerview, es la referencia a su vista de reciclador.
Estoy tratando de obtener la vista del niño por posición. Podría obtener la vista cuando se hace clic en un elemento:
rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
((MainActivity) getActivity()).showSellRecordFragment(position, view);
}
}));
Ahora no puedo obtener la vista secundaria, sin hacer clic, digamos por posición, por ejemplo:
rvSellRecords.someMagicalMethodWhichReturnsViewByPosition(5);
Pregunta: ¿Cómo obtener la vista del niño desde RecyclerView?
EDITAR PARA BOUNTY :
Tengo RecyclerView
para mostrar la lista de productos. Cuando hago clic en él, estoy agregando un fragmento nuevo donde muestro información del producto. Al abrir, estoy actualizando la barra de herramientas con vista desde RecyclerView
. Esto funciona perfectamente:
rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
sellPresenter.onSellRecordSelected(position, view);
}
}));
When I click blue button with "+", I am incrementing quantity by 1.
public void onIncrementButtonClicked(){
sellRecord.setCount(sellRecord.getCount() + 1);
showQuantity();
bus.post(new SellRecordChangedEvent(sellRecord, sellRecordPosition));
}
Then I am posting updated sellRecord to first fragment using EventBus. There I am updating list data. I supposed that updating value(sell) automatically updates adapter. Now I am getting view from adapter using custom method(getView) which was created by me(you can find it below).
@Subscribe
public void onEvent(SellRecordChangedEvent event){
sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord());
sell.recalculate();
int position = event.getSellRecordPosition();
View view = adapter.getView(position);
bus.post(new TransactionTitleChangedEvent(null, view));
}
This is my adapter class - I changed adapter little bit to collect view in list and added method which returns view for respective position:
public class SellRecordsAdapter extends RecyclerView.Adapter<SellRecordsAdapter.ViewHolder> {
.....
.....
.....
List<View> viewList;
public SellRecordsAdapter(List<SellRecord> sellRecordList) {
.....
viewList = new ArrayList<>();
}
.....
.....
.....
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
.....
.....
.....
viewList.add(i, viewHolder.itemView);
}
public View getView(int position){
return viewList.get(position);
}
}
Mi problema : cuando actualizo la vista en la barra de herramientas, obtengo la vista anterior. Cuando la cantidad es 3, obtengo la vista con 2. Cuando la cantidad 10 - la vista es con 9.
Mi pregunta : ¿cómo obtener una vista de la vista del reciclador usando la posición del elemento (sin hacer clic en el oyente)?
Escribe este método en el adaptador.
public Object getItem(int position) {
return yourArrayList.get(position);
}
y solo necesitas llamarlo como
yourAdapter.getItem(2);
pasar su posición requerida Espero que resuelva tu problema.
Espero que esto ayude a alguien: estaba recibiendo excepciones de puntero nulo con:
- recyclerView.findViewHolderForAdapterPosition
- recyclerView.findViewHolderForItemId
- layoutManager.findViewByPosition.
La razón fue que hay un ligero retraso para que se cree el visor. Encontré la solución aquí: https://.com/a/33414430/7952427
Publico una respuesta porque es realmente complejo para encontrar vistas () de RecyclerView.
@Joe: Después de pasar 4 horas encontré una respuesta. Lo que me da la correcta vista del índice.
mAdapter is adapter of RecyclerView
View v = recyclerView.findViewHolderForItemId(mAdapter.getItemId(index/position)).itemView;
Ahora solo tiene que acceder a sus vistas a través de: v.findViewById(R.id.edittext)
O cualquier ID.
Puedes usar el LayoutManager de RecyclerView para ello.
View view = layoutManager.findViewByPosition(position)
Yo no recomendaría el seguimiento de la lista de vistas a ti mismo. Podría llevar a problemas extraños con actualizaciones de artículos, actualizaciones de posición, etc.
En su lugar, en su SellRecordChangedEvent, use findViewHolderForAdapterPosition () en lugar de adapter.getView ().
@Subscribe
public void onEvent(SellRecordChangedEvent event){
sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord());
sell.recalculate();
int position = event.getSellRecordPosition();
View view = yourrecyclerview.findViewHolderForAdapterPosition(position);
bus.post(new TransactionTitleChangedEvent(null, view));
}
Y como nota al margen, es mejor implementar un escucha de clic de elemento real para el itemView en el ViewHolder en lugar de usar la escucha táctil. Hay muchos ejemplos de esto en línea.
ahora entiendo tu problema debe utilizar la interfaz para unir el elemento y la actividad de recyclerview. Debe definir una clase de interfaz como la siguiente:
public interface IViewClick {
public void onClickButtonAdd();
}
agregue este parámetro a su clase de adaptador:
private IViewClick mListener;
e inicializarlo en el constructor con el valor que se obtiene de las entradas. cuando el usuario haga clic en el botón PLUS, enviará un evento a la actividad por esta línea:
mListener.onClickButtonAdd();
en su clase de actividad, debe implementar la interfaz IViewClick y agregar su código allí, como esto:
@Override
public void onClickButtonAdd() {
/// TODO every thing that you want.
/// change your toolbar values.
}
No es una buena solución para ti.
RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForItemId (mAdapter.getItemId (i));
simplemente ponga este método en su código y puede llamarlo como quiera
void someMagicalMethodWhichReturnsViewByPosition(int position){
//I assumes child views are CardView
CardView c = (CardView)rvSellRecords.getItem(int position);
///optional codes
//////////
}
use recyclerView.findViewHolderforLayoutPosition(position)
o reyclerView.findViewHolderforAdaperPosition(position)
para obtener el marcador para la posición. Entonces puedes acceder a cualquier niño desde tu punto de vista.
pago Recyclerview
RecyclerView.ViewHolder holder = recycleView.findViewHolderForAdapterPosition(position);
ImageView imageView = holder.itemView.findViewById(R.id.iv_product);
Este es un suplemento a la respuesta de @Ravi Teja. Puede obtener el viewHolder de recyclerView usando la posición del elemento en particular, luego obtener una vista particular del viewHolder como se muestra arriba