2016-02-16 3 views
18

Я пытаюсь получить детское представление по положению. Я мог бы получить представление, когда один элемент щелкнул:Как получить дочерний вид из RecyclerView?

rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      ((MainActivity) getActivity()).showSellRecordFragment(position, view); 
     } 
    })); 

Теперь я не могу получить вид ребенка, без щелчка - скажем, на позиции, например:

rvSellRecords.someMagicalMethodWhichReturnsViewByPosition(5); 

Вопрос: Как получить вид ребенка от RecyclerView?

редактирования.К BOUNTY:

enter image description here

RecyclerView У меня есть, чтобы показать список продуктов. Когда я нажимаю на нее, я добавляю новый фрагмент, где я показываю информацию о продукте. В то время как открытие Я обновляю панель с видом из RecyclerView - это прекрасно работает:

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); 
    } 

} 

Моя проблема: когда я обновляя представление в панели инструментов, я старею вид. Когда количество равно 3, я получаю представление с 2. Когда количество 10 - вид с 9.

Мой вопрос: как получить представление из вида recycler с использованием позиции позиции (без прослушивателя кликов)?

enter image description here

+0

Почему вы меня минуете? –

+0

U хотите получить просмотр ребенка без щелчка ?? – Manishika

+0

Да, я хочу получить представление без нажатия - используя позицию –

ответ

0

Написать этот метод в адаптер.

public Object getItem(int position) { 
     return yourArrayList.get(position); 
    } 

и вам просто нужно назвать его как

yourAdapter.getItem(2); 

проходить требуемое положение. Надеюсь, он решает вашу проблему.

2

Для этого вы можете использовать LayoutManager RecyclerView.

View view = layoutManager.findViewByPosition(position) 
+0

Спасибо за ваш ответ, к сожалению этот метод возвращает null –

+0

Вы уверены, что используете тот же LayoutManager, который вы предоставили в RecyclerView? –

+0

Да, я уверен, потому что дважды пробовал в разных местах. Например: rvSellRecords.addOnItemTouchListener (новый RecyclerItemClickListener (getActivity(), новый RecyclerItemClickListener.OnItemClickListener() { @Override общественного недействительными onItemClick (View вид, внутр положение) { Посмотреть view2 = layoutManager.findViewByPosition (положение); ((MainActivity) getActivity()). ShowSellRecordFragment (position, view2); } })); –

0

просто поставить этот метод в вашем коде, и вы можете назвать это, как вы любите

void someMagicalMethodWhichReturnsViewByPosition(int position){ 
     //I assumes child views are CardView 
     CardView c = (CardView)rvSellRecords.getItem(int position); 
     ///optional codes 
     ////////// 
    } 
0

теперь я понимаю вашу проблему. вам нужно использовать интерфейс для включения элемента recyclerview и активности. вы должны определить класс интерфейс, как показано ниже:

public interface IViewClick { 
    public void onClickButtonAdd(); 
} 

добавить этот параметр в класс адаптера:

private IViewClick mListener; 

и инициализировать его в конструкторе со значением, которые получают от входов. , когда пользователь нажимает на кнопку PLUS, вы отправляете событие активности этой линии:

mListener.onClickButtonAdd(); 

в своем классе деятельности вы должны реализующего интерфейс IViewClick и добавить свой код там, как это:

@Override 
    public void onClickButtonAdd() { 
     /// TODO every thing that you want. 
     /// change your toolbar values. 
    } 

его по не является хорошим решением для вас.

RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForItemId (mAdapter.getItemId (i));

+0

Благодарим вас за предложение, но эта проблема все еще остается: когда я обновляю вид на панели инструментов, я становлюсь старым. Когда количество равно 3, я получаю представление с 2. Когда количество 10 - вид с 9. –

12

recyclerView.findViewHolderforLayoutPosition(position) или reyclerView.findViewHolderforAdaperPosition(position), чтобы получить зрителя для публикации. Затем вы можете получить доступ к любому ребенку из своего зрителя.

фотографии Recyclerview

+0

Это помогло мне. Благодаря :) – KratosBala

0

Я не рекомендовал бы отслеживать список просмотра самостоятельно. Это может привести к возникновению странных проблем с обновлением позиций, обновлением позиций и т. Д.

Вместо этого на вашем SellRecordChangedEvent используйте findViewHolderForAdapterPosition() вместо 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)); 
} 

http://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)

И как примечание стороны, это лучше осуществить фактический нажмём слушателя к itemView на ViewHolder вместо использования сенсорного слушателя. Существует множество примеров этого онлайн.

0

Таким образом, переработка и информация о вашем продукте представлены в двух разных фрагментах да? Вы ожидаете, что взгляды recyclerview будут обновляться, когда они даже не будут на переднем плане? также вы меняете данные элемента данных адаптера в позиции event.getSellRecordPosition(), но вы не уведомляете адаптер о том, что его набор данных был изменен, либо на adapter.notifyDataSetChanged(), либо на другие методы notifyItemChanged(position).

Я бы изменить свой OnEvent() следующим образом:

@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)); 
} 

Вызов на createViewHolder и следующий BindViewHolder на адаптер, безусловно, обновить взгляды на эту позицию, то ваша adapter.getView (позиция) должна возвращать вы последний вид.

Здесь MyViewHolder ваш класс viewholder и yourRecyclerview, является ссылкой на ваш взгляд ресайклера

2

я отправить ответ, потому что является очень сложным для findviews() из RecyclerView.

@Joe: После проводов 4 часа нашли один ответ. Это дает мне правильный взгляд на индекс.

mAdapter is adapter of RecyclerView   
View v = recyclerView.findViewHolderForItemId(mAdapter.getItemId(index/position)).itemView; 

Теперь просто получить доступ к своему виду на: v.findViewById(R.id.edittext) ИЛИ любой идентификатор.

0
RecyclerView.ViewHolder holder = recycleView.findViewHolderForAdapterPosition(position); 
ImageView imageView = holder.itemView.findViewById(R.id.iv_product); 

Это дополнение к ответу @Ravi Teja. Вы можете получить viewHolder из recyclerView с использованием позиции конкретного элемента, а затем получить определенный вид из viewHolder, как показано выше.

Смежные вопросы