2016-04-30 16 views
0

私は2つのスライディングタブ(フラグメント)でアクティビティを持っています。私はRecyclerviewのヘッダを動的に作成したいので、ユーザはその中にedittextを持つdialogBoxを取得します。 edittextにヘッダ名を入力した後、ユーザがOKをクリックすると、文字列はアクティビティからフラグメントに渡されます。私は、インターフェイスを使用して、アクティビティからヘッダー名をフラグメントに転送することに成功しました。フラグメント内のメソッドはその文字列を受け取ります。sectionedrecyclerview:新しいヘッダーを動的に作成できませんでした

方法:

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

       AddSection(datainfo); 
      } 

しかし、私はそれがAddSection()メソッドに渡されるので、そのフラグメント]タブでRecyclerviewための新しいヘッダを作成するために、受信した文字列を使用する必要があります。私はそのフラグメントの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; 

    } 

} 


} 

ERROR:

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方法が正しいようだ、あなたはAddSectionが呼び出された後onCreateView方法が解雇されていないことを確認していますか?あなたのログをチェックしてください。

+0

のために有用であるホープ;'この行でAddSectionに方法。これを解決するには? – Naroju

+0

フラグメントがそのユーザーインターフェイスを描画する前にAddSectionを呼び出すようです。 sectionAdapter = new SectionedRecyclerViewAdapter();行を移動することを検討する必要があります。 onCreateViewからフラグメントのonCreateメソッドへフラグメントのライフサイクル[here]に関する詳細(http://developer.android.com/guide/components/fragments.html)。 – Gustavo

+0

それはTabLayoutです。スライディング(Tab1とTab2)の2つのフラグメントがあります。アプリケーションが一度に起動すると、アタビリティと2つのタブレイアウトが作成されます。何度も何度も再現されることはありません。創造することはまったく呼び出されません。 sectionadapterが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にページャーを使用しているので、私はpagerAdapterに既にインスタンス化されたフラグメントのインスタンスを取得するgetfragmentメソッドを実装しました。詳細については

@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をチェックし、私が私が `sectionAdapter.addSection(myadapterNew)でnullポインタ例外を逃したのか分からない誰か

関連する問題