sectionedrecyclerview:无法动态创建新标题 [英] sectionedrecyclerview: Could not create new header dynamically

查看:47
本文介绍了sectionedrecyclerview:无法动态创建新标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有两个滑动标签(片段)的活动.我想为Recyclerview动态创建一个标题,以便用户将获得一个带有edittext的对话框.在编辑文本中键入标题名称后,一旦用户单击确定",该字符串就会从活动传递到片段.我已成功使用接口将标头名称从活动转移到片段.片段中的方法将接收该字符串.

I have an activity with two sliding tabs(fragments). I want to create a header for Recyclerview dynamically, so that the user will get a dialogBox with an edittext in it. As soon as user clicks OK after typing the header name in the edittext, the string gets passed from activity to fragment. I have succeeded in transferring header name from activity to fragment using interface. A method in fragment will receive that string.

方法:

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

              AddSection(datainfo);
          }

但是,我需要使用接收的字符串在该片段选项卡中为Recyclerview创建一个新的头,以便将其传递给AddSection()方法.我已经在该片段的onCreateView中初始化了必要的类.我只需要在AddSection()方法中执行此操作.

However, I need to use the received string to create a new header for the Recyclerview in that fragment tab, so it gets passed to AddSection() method. I have initialized the necessary classes already in onCreateView of that fragment. I simply need to do this in AddSection() method.

AddSection方法:

AddSection method:

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

它必须创建一个新的标头,但没有创建一个标头.

It has to create a new header, but it is not creating one.

FragmentCode:

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)

推荐答案

我解决了我的问题.我怀疑,一旦用户输入标题名称,标题就会传递到片段中.但是,该字符串没有用,因为sectionAdapter实例不再存在以使用该字符串并创建标头.我必须获取片段实例,该片段实例已在开始时实例化(当应用启动时).因此,这就是我为使其正常工作所做的事情.

I solved My problem. As I suspected, Once the user entered header name, the header is passing into the fragment. However the string there is useless, as the sectionAdapter instance no longer exists to use that string and create a header. I have to get instance of fragment which is already instantiated in the beginning(when app starts). So here is what I did to get it work.

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

我已使用上面的代码将标头字符串发送到片段.当我将Tabr用于TabLayout时,我实现了getfragment方法来获取pagerAdapter中已实例化的片段的实例.

I have used above code to send header string to the fragment. As I am using pager for my TabLayout, I have implemented getfragment method to get the instance of already instantiated fragment in my 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;
    }
}

有关更多详细信息,请检查此链接,希望对某人有用

For more details, check this Link, Hope it is useful for someone

这篇关于sectionedrecyclerview:无法动态创建新标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆