【问题标题】:How to load a fragment using an adapter class如何使用适配器类加载片段
【发布时间】:2019-01-17 15:07:28
【问题描述】:

适配器类

公共类 juiceAdapterGreens 扩展 RecyclerView.Adapter { AppCompatActivity appCompatActivity;

private List<Greens> juiceList;

public static class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView header,quantity,price,pieces;
    public ImageView juicebottle;

    public MyViewHolder(View view) {
        super(view);
        header = (TextView) view.findViewById(R.id.headergreens);
        quantity = (TextView) view.findViewById(R.id.quantitygreens);
        price = (TextView) view.findViewById(R.id.pricegreens);
        pieces = (TextView) view.findViewById(R.id.piecesgreens);
        juicebottle=(ImageView)view.findViewById(R.id.juicebottlegreens);
    }
}
public juiceAdapterGreens(Context context, List<Greens> juiceList) {
    this.juiceList = juiceList;
}

@Override
public juiceAdapterGreens.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.home_greens, parent, false);




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

            DummyFragement dummyFragement = new DummyFragement ();
            Context context=null;
            ((MainActivity)context).getSupportFragmentManager().beginTransaction().replace(R.id.container, dummyFragement,"OptionsFragment").addToBackStack(null).commit();


            Fragment f1=Profile_Frag.newInstance("","");
            replace(f1);
        }
    });
    return new juiceAdapterGreens.MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(juiceAdapterGreens.MyViewHolder holder, int position) {
    Greens juice = juiceList.get(position);
    holder.header.setText(juice.getTitle());
    holder.quantity.setText(juice.getQuantity());
    holder.price.setText(juice.getPrice());
    holder.pieces.setText(juice.getPieces());
    holder.juicebottle.setImageResource(juice.getJuicebottle());
}

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

private void replace(Fragment f1) {
    FragmentManager fm=this.appCompatActivity.getSupportFragmentManager();
    FragmentTransaction ft=fm.beginTransaction();
    ft.addToBackStack(null);
    ft.replace(R.id.frame_content_main,f1);
    ft.commit();
}
}

getSupportFragmentManager() 显示为红色,我只需要使用上面输入的适配器类加载一个片段。请帮帮我。

E/AndroidRuntime: FATAL EXCEPTION: main
                  java.lang.NullPointerException
                      at com.example.jayarajarackal.juiceapp.juiceAdapterGreens.replace(juiceAdapterGreens.java:84)
                      at com.example.jayarajarackal.juiceapp.juiceAdapterGreens.access$000(juiceAdapterGreens.java:20)
                      at com.example.jayarajarackal.juiceapp.juiceAdapterGreens$1.onClick(juiceAdapterGreens.java:60)
                      at android.view.View.performClick(View.java:4204)
                      at android.view.View$PerformClick.run(View.java:17355)
                      at android.os.Handler.handleCallback(Handler.java:725)
                      at android.os.Handler.dispatchMessage(Handler.java:92)
                      at android.os.Looper.loop(Looper.java:137)
                      at android.app.ActivityThread.main(ActivityThread.java:5069)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:511)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                      at dalvik.system.NativeStart.main(Native Method)
Application terminated.

【问题讨论】:

  • 你好,拉朱!欢迎来到 StackOverflow!请考虑查看stackoverflow.com/tour 以了解有关 StackOverflow 的更多信息。其次,你能展示一下你是如何设置appCompatActivity的吗?您的适配器类根本没有设置 appCompatActivity
  • 除非它在红色标记中显示错误。发帖前忘记删了,抱歉

标签: android fragment adapter


【解决方案1】:

您在OnClick 回调中将context 定义为null

Context context=null;

这就是它抛出NullPointerException的原因

要使这种行为无效,请在 MyViewHolder 类中声明一个变量 activityContext 并将变量 context 赋值为

public juiceAdapterGreens(Context context, List<Greens> juiceList) {
...
activityContext = context;
}

然后就可以使用了

context.getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, dummyFragement,"OptionsFragment")
.addToBackStack(null).commit();

【讨论】:

  • 之前发布的代码对于防止异常很有用。如果您想以正确的方式加载片段,请使用以下内容: Fragment fragment = new MyFragment(); FragmentManager fm = context.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.content_frame,片段); ft.commit();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多