2016-09-10 4 views
0

Я пытаюсь использовать recyclerView, который находится внутри фрагмента. Этот фрагмент вложен внутри viewPager.onCreateViewHolder никогда не называется

public class UniversityDetail extends Fragment { 

RecyclerView universityDetailView; 

//need to set Adapter 

public static UniversityDetail newInstance(){ 
    return new UniversityDetail(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View view = inflater.inflate(R.layout.fragment_university_lsit,container,false); 
    universityDetailView = (RecyclerView)view; 
    setupViews(); 
    return view; 
} 


private void setupViews(){ 
    //set the adapter 
    UniversityDetailAdapter detailAdapter = new UniversityDetailAdapter(new ArrayList<UniversityDetails>()); 
    universityDetailView.addItemDecoration(new RecyclerListDecorater(getActivity())); 
    universityDetailView.setAdapter(detailAdapter); 
    universityDetailView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    universityDetailView.setHasFixedSize(false); 
} 

public RecyclerView getRecyclerView(){ 
    return this.universityDetailView; 
    } 
} 

Это фрагмент, который я хочу быть внутри viewPager.It возвращает recyclerView из onCreateView.

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/scroll" 
android:paddingBottom="8dp" 
android:paddingTop="?attr/actionBarSize" 
android:scrollbars="vertical"> 

fragment_university_lsit.xml

recyclerView использует ниже адаптера.

public class UniversityDetailAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private List<UniversityDetails> universityDetails; 
private static Map<String,String> admissionRecommendation; 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    ((DetailHolder)holder).bind(universityDetails.get(position)); 
} 

@Override 
public int getItemCount() { 
    return universityDetails.size(); 
} 

public UniversityDetailAdapter(List<UniversityDetails> details){ 
    this.universityDetails = details; 
} 
@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){ 
    Log.d("CreateUniveristyDetail", "onCreateViewHolder: detail called"); 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.detail_fragment,parent,false); 
    return new DetailHolder(itemView); 
    } 
} 

DetailHolder класс расширяет ReyclerView.ViewHolder и его реализация не имеет значения здесь.

Список адаптер upated от обработчика и notifyDataSetChanged()

private void setup(){ 
    mHandler = new Handler(Looper.getMainLooper()){ 
     @Override 
     public void handleMessage(Message message){ 
      if(message.what == ConnectionHandler.DETAILMSG){ 
       Log.d("detail handle message", "handleMessage: Called"); 
       List<UniversityDetails> details = (List<UniversityDetails>)message.obj; 
       UniversityDetailAdapter adapter = (UniversityDetailAdapter)universityDetail.getRecyclerView().getAdapter(); 
       adapter.addAll(details); 
       adapter.notifyDataSetChanged(); 
       Log.d("size", "handleMessage: " + adapter.getItemCount()); 
      } 
     } 
    }; 
} 

Фрагмент создан в деятельности ..

private void setupNavigation(){ 
    ViewPagerAdapter pagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    universityDetail = UniversityDetail.newInstance(); 
    pagerAdapter.addFragment(universityDetail); 
    mViewPager.setAdapter(pagerAdapter); 

    //setup the fragment transaction. 

    headerTab.setViewPager(mViewPager,0); 
    //no need to add to back stack 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.add(R.id.view_pager,universityDetail); 
    transaction.commit(); 
} 

Реализация DetailHolder

public class DetailHolder extends RecyclerView.ViewHolder{ 

    CardView admissionGeneral; 
    public View root; 

    public DetailHolder (View itemView){ 
     super(itemView); 
     root = itemView; 
     admissionGeneral = (CardView)root.findViewById(R.id.admission_general); 
    } 

    public void bind(UniversityDetails detail){ 

     Log.d("detail bind", "bind: binding to recyclerView"); 

     } 
    } 

здесь логарифм adapter.getItemCount(); return 3; thats означает что-то добавляется, и onCreateViewHolder должен быть вызван, но он никогда не был.

Странно, что я реализовал другой recyclerAdapter - тот же самый проект и его работа отлично.

+0

Если это никогда не называется, то вы никогда не делаете экземпляр фрагмента. Если вы считаете, что это так, пожалуйста, покажите этот код. –

+0

Я уложил его в действие и вызвал, когда была создана активность. –

+0

Итак, вы говорите, что onCreateView не вызывается, но вы можете получить адаптер RecyclerView и добавить к нему данные ... Похоже, что это называется. Попробуйте добавить оператор журнала там –

ответ

0

Эта проблема будет легче ответить, если бы вы могли показать, как назначался universityDetail из любого класса, содержащего использование Handler.

Непонятно также, как message.obj может быть отнесен к списку.

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


Итак, вы знаете, эта линия хорошо

List<UniversityDetails> details = (List<UniversityDetails>)message.obj; 

потому что вы видите 3 на выходе, когда вы делаете это

Log.d("size", "handleMessage: " + adapter.getItemCount()); 

Теперь, эти линии, вероятно, может быть проблема.

UniversityDetailAdapter adapter = (UniversityDetailAdapter)universityDetail.getRecyclerView().getAdapter(); 
adapter.addAll(details); 
adapter.notifyDataSetChanged(); 

Во-первых, нет addAll метод RecyclerView.Adapter. Поэтому я не уверен, как это скомпилировано. Anyways ...

Постарайтесь, чтобы межклассовые ссылки были минимальными. Здесь мы раскрываем только метод для добавления деталей, а не всего RecyclerView.

Тогда для RecyclerViews, вы должны сообщить только данные, которые были вставлены, а не все это с помощью notifyItemRangeInserted

public class UniversityDetailFragment extends Fragment { 

    private RecyclerView universityDetailView; 
    private UniversityDetailAdapter detailAdapter; 

    private List<UniversityDetails> details = new ArrayList<UniversityDetails>(); 

    ... 

    public void setupViews() { 
     detailAdapter = new UniversityDetailAdapter(details); 
     // etc... 
    } 

    public void addDetails(List<UniversityDetails> details) { 
     int curSize = detailAdapter.getItemCount(); 
     this.details.addAll(details); 
     detailAdapter.notifyItemRangeInserted(curSize, details.size()); 
    } 
} 

, а затем просто использовать экземпляр вашего фрагмента

if(message.what == ConnectionHandler.DETAILMSG){ 
     Log.d("detail handle message", "handleMessage: Called"); 
     List<UniversityDetails> details = (List<UniversityDetails>) message.obj; 
     universityDetail.addDetails(details); 

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

public class UniversityDetailAdapter extends RecyclerView.Adapter<DetailHolder> 
Смежные вопросы