私は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)
のために有用であるホープ;'この行でAddSectionに方法。これを解決するには? – Naroju
フラグメントがそのユーザーインターフェイスを描画する前にAddSectionを呼び出すようです。 sectionAdapter = new SectionedRecyclerViewAdapter();行を移動することを検討する必要があります。 onCreateViewからフラグメントのonCreateメソッドへフラグメントのライフサイクル[here]に関する詳細(http://developer.android.com/guide/components/fragments.html)。 – Gustavo
それはTabLayoutです。スライディング(Tab1とTab2)の2つのフラグメントがあります。アプリケーションが一度に起動すると、アタビリティと2つのタブレイアウトが作成されます。何度も何度も再現されることはありません。創造することはまったく呼び出されません。 sectionadapterがonCreateviewで初めて初期化されたので、再利用できませんか? – Naroju