2016-04-30 3 views
0

У меня есть активность с двумя скользящими вкладками (фрагментами). Я хочу создать заголовок для Recyclerview динамически, так что пользователь получит диалоговое окно с edittext в нем. Как только пользователь нажимает OK после ввода имени заголовка в редакторе, строка передается от операции к фрагменту. Мне удалось передать имя заголовка из активности в фрагмент, используя интерфейс. Метод в фрагменте получит эту строку.sectionedrecyclerview: Не удалось создать новый заголовок динамически

Метод:

  @Override 
      public void setDatainfo(String datainfo) { 
       Log.d("receivedset",datainfo); 

       AddSection(datainfo); 
      } 

Однако, мне нужно, чтобы использовать полученную строку, чтобы создать новый заголовок для Recyclerview в этой вкладке фрагмент, поэтому он получает передается AddSection() метод. Я инициализировал необходимые классы уже в onCreateView этого фрагмента. Мне просто нужно сделать это в методе AddSection().

метод AddSection:

public void AddSection(String datainfo){ 
     MyadapterNew myadapterNew = new MyadapterNew(datainfo,getActivity(),R.layout.headerpond,R.layout.file_row_new,fDataset); 

     Log.d("received",datainfo); 
     sectionAdapter.addSection(myadapterNew); 
     sectionAdapter.notifyDataSetChanged(); 
    } 

Он должен создать новый заголовок, но это не создает один.

FragmentCode:

public class tab1 extends android.support.v4.app.Fragment implements home.infopass { 
     public ArrayList<String> fDataset = new ArrayList<>(); 
     private Context context; 
     private SectionedRecyclerViewAdapter sectionAdapter; 

     RecyclerView fRecyclerView; 
     @Override 

     @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
      View v =inflater.inflate(R.layout.tab1, container, false); 
      Log.d("tab1", "OncreateView"); 
      registerForContextMenu(v); 

      sectionAdapter = new SectionedRecyclerViewAdapter(); 

      MyadapterNew myadapterNew = new MyadapterNew("Pond1",getActivity(),R.layout.headerpond,R.layout.file_row_new,fDataset); 

      sectionAdapter.addSection(myadapterNew); 

      fRecyclerView = (RecyclerView) v.findViewById(R.id.file_tab); 
      fRecyclerView.setHasFixedSize(true); 

      RecyclerView.LayoutManager fLayoutManager = new LinearLayoutManager(this.getContext()); 

      fRecyclerView.setLayoutManager(fLayoutManager); 
      fRecyclerView.setAdapter(sectionAdapter); 

      return v; 
     } 

     @Override 
     public void setDatainfo(String datainfo) { 
      Log.d("receivedset",datainfo); 

      AddSection(datainfo); 
     } 
     public void AddSection(String datainfo){ 
      MyadapterNew myadapterNew = new MyadapterNew(datainfo,getActivity(),R.layout.headerpond,R.layout.file_row_new,fDataset); 

      Log.d("received",datainfo); 
      sectionAdapter.addSection(myadapterNew); 
      sectionAdapter.notifyDataSetChanged(); 
     } 

    private class MyadapterNew extends StatelessSection { 
     List<String> data = new ArrayList<>(Arrays.asList("xyz", "abc", "xyhgz", "abygc")); 

     String header; 

     Context ctx; 

     Boolean Expanded = false; 
     public MyadapterNew(String header,Context ctx,int headerResourceId, int itemResourceId,ArrayList<String>data) { 
      super(headerResourceId, itemResourceId); 
      //this.data = data; 
      this.ctx=ctx; 
      this.header=header; 
     } 


     class HeaderViewHolder extends RecyclerView.ViewHolder { 
      TextView header; 
      public HeaderViewHolder(View view) { 
       super(view); 

       header = (TextView)view.findViewById(R.id.header); 
      } 
     } 

    class MyItemViewHolder extends RecyclerView.ViewHolder { 
     private TextView filename; 

     private ProgressBar file_progressbar; 

     private ImageView fileicon; 

     private ImageView upldownstatus; 

     private TextView filelength; 


     public MyItemViewHolder(View itemView) { 
      super(itemView); 
      filename = (TextView) itemView.findViewById(R.id.filename); 

      file_progressbar = (ProgressBar) itemView.findViewById(R.id.file_progressbar); 

      fileicon = (ImageView)itemView.findViewById(R.id.fileicon); 

      upldownstatus = (ImageView)itemView.findViewById(R.id.updownstatus); 

      filelength = (TextView)itemView.findViewById(R.id.filelength); 


     } 
    } 

    public void addItem(int position, String item) { 


    } 

    public void removeItem(int position) { 
     this.data.remove(position); 
     sectionAdapter.notifyDataSetChanged(); 

    } 

    public void addHeader(int position, String item) { 
    } 

    public void removeHeader(int position) { 
    } 

    @Override 
    public RecyclerView.ViewHolder getItemViewHolder(View view) { 

     return new MyItemViewHolder(view); 
    } 

    @Override 
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) { 
     return new HeaderViewHolder(view); 
    } 


    @Override 
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) { 
     final MyItemViewHolder itemHolder = (MyItemViewHolder) holder; 
     itemHolder.filename.setText(data.get(position)); 
     final Animation animationFadeOut = AnimationUtils.loadAnimation(ctx, R.anim.fadeout); 

     itemHolder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Log.d("CLICKED", "TRUE"); 

       itemHolder.itemView.setAnimation(animationFadeOut); 

      } 
     }); 

    } 

    @Override 
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { 
     super.onBindHeaderViewHolder(holder); 

     HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; 
     ((HeaderViewHolder) holder).header.setText(header); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Expanded=!Expanded; 
       sectionAdapter.notifyDataSetChanged(); 

      } 
     }); 

    } 

    @Override 
    public int getContentItemsTotal() { 
     return Expanded? data.size():0; 

    } 

} 


} 

ОШИБКА:

05-01 01:26:08.915 1571-1571/com.example.sandesh.filer E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.example.sandesh.filer, PID: 1571 
                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String io.github.luizgrp.sectionedrecyclerviewadapter.SectionedRecyclerViewAdapter.addSection(io.github.luizgrp.sectionedrecyclerviewadapter.Section)' on a null object reference 
                     at com.example.sandesh.filer.tab1.AddSection(tab1.java:197) 
                     at com.example.sandesh.filer.tab1.setDatainfo(tab1.java:90) 
                     at com.example.sandesh.filer.home$3.onClick(home.java:313) 
                     at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:135) 
                     at android.app.ActivityThread.main(ActivityThread.java:5343) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

ответ

0

Ваш метод AddSection кажется правильным, вы уверены, что метод onCreateView не увольняют после AddSection называлась? проверьте свои журналы.

+0

Я не знаю, как я пропустил исключения нулевого указателя на 'sectionAdapter.addSection (myadapterNew),' на этой линии в AddSection метод. как это решить? – Naroju

+0

Похоже, вы вызываете AddSection до того, как фрагмент рисует свой пользовательский интерфейс. Вы должны рассмотреть перемещение строки sectionAdapter = new SectionedRecyclerViewAdapter(); от onCreateView до метода onCreate вашего фрагмента. Подробнее о жизненном цикле фрагментов [здесь] (http://developer.android.com/guide/components/fragments.html). – Gustavo

+0

- это TabLayout, будет разворачиваться два фрагмента (Tab1 и Tab2). Эффективность и два макета вкладки создаются, когда приложения запускаются за раз. Он не будет воссоздаваться снова и снова. Так что он не будет вызван вообще. Поскольку первый раз, когда он впервые был инициализирован в onCreateview, мы не можем его повторно использовать? – Naroju

0

Я решил проблему. Как я подозревал, как только пользователь ввел имя заголовка, заголовок переходит в фрагмент. Однако строка бесполезна, поскольку экземпляр sectionAdapter больше не существует для использования этой строки и создания заголовка. Мне нужно получить экземпляр фрагмента, который уже создан в начале (когда приложение запускается). Итак, вот что я сделал, чтобы заставить его работать.

 int position = tabLayout.getSelectedTabPosition 
         Fragment fragment = adapter.getFragment(tabLayout 
             .getSelectedTabPosition()); 
           if (fragment != null) { 
            switch (position) { 
             case 0: 
              ((tab1) fragment).AddSection(data); 
              break; 
            } 
           } 

Я использовал выше код для отправки строки заголовка фрагменту. Поскольку я использую пейджер для моего TabLayout, я реализовал метод getfragment, чтобы получить экземпляр уже созданного фрагмента в моем pagerAdapter.

@Override 
public Object instantiateItem(final ViewGroup container, final int position) { 
    final Fragment fragment = (Fragment) super.instantiateItem(container, position); 
    instantiatedFragments.put(position, new WeakReference<>(fragment)); 
    return fragment; 
} 

@Override 
public void destroyItem(final ViewGroup container, final int position, final Object object) { 
    instantiatedFragments.remove(position); 
    super.destroyItem(container, position, object); 
} 

@Nullable 
public Fragment getFragment(final int position) { 
    final WeakReference<Fragment> wr = instantiatedFragments.get(position); 
    if (wr != null) { 
     return wr.get(); 
    } else { 
     return null; 
    } 
} 

Для получения более подробной информации, проверить этот Link, Надеюсь, что это полезно для кого-то

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