Android Fragments viewPager.setCurrentItem在适配器内部不工作

xa9qqrwz  于 2023-08-06  发布在  Android
关注(0)|答案(1)|浏览(127)

我正在使用适配器将视图从Firebase填充到CardView。我尝试在适配器内的cardView中的一个项目上使用onclicklistener打开一个新片段。当我不使用fragment时,它可以正常工作,打开Activity2,如下所示:

public void onBindViewHolder(ViewHolder holder, int position) {
    Upload upload = (Upload) this.uploads.get(position);
    holder.textViewName.setText(upload.getName());
    Glide.with(this.context).load(upload.getUrl()).into(holder.imageView);
    holder.textViewYear.setText(upload.getYr());
    holder.mView.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            v.getContext().startActivity(new Intent(v.getContext(), Activity2.class));
        }
    });
}

字符串
现在,在使用片段时,我尝试在适配器中使用viewpager来在单击卡片时选择另一个视图,这不起作用。每次我启动应用程序时,它都会在点击卡时崩溃:

public void onBindViewHolder(ViewHolder holder, int position) {
    Upload upload = (Upload) this.uploads.get(position);
    holder.make.setText(upload.getName());
    Glide.with(this.context).load(upload.getUrl()).into(holder.imageView);
    holder.year.setText(upload.getYr());
    
    holder.mView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            viewPager.setCurrentItem(3);
        }
    });
}


这是我的crash logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: greeny.cop, PID: 22602
  java.lang.NullPointerException
  at greeny.cop.Adapter.CarPath$1.onClick(CarPath.java:61)
  at android.view.View.performClick(View.java:4446)
  at android.view.View$PerformClick.run(View.java:18430)
  at android.os.Handler.handleCallback(Handler.java:733)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5281)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:932)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:748)
  at dalvik.system.NativeStart.main(Native Method)


提前感谢任何帮助。

bttbmeg0

bttbmeg01#

考虑到你的片段中有你的视图分页器。
您的ViewPager未初始化,并且您初始化ViewPager的方式不正确。
你可以使用一个接口来做这件事。
创建接口

public interface ViewPagerListener{
    void setViewPager(int position);
}

字符串
在片段中实现接口

public class MyFragment extends Fragment implements ViewPagerListener{

    //method to be implemented.
    public void setViewPager(int position){
       //TODO: do your implementation here
    }

}


在适配器的一个构造函数中添加ViewPagerListener参数

public class MyAdapter extends ArrayAdapter<Obj>{

    Context c;
    ArrayList<Obj> objects
    ViewPagerListener mListener;

    public MyAdapter(Context c,ArrayList<Obj> objects,ViewPagerListener mListener){
        this.c = c;
        this.objects = objects;
        this.mListener = mListener;
    }

}


在你的片段中,像这样初始化你的适配器

MyAdapter myAdapter = new MyAdapter(getActivity(),objects,MyFragment.this); //3rd param is your interface instance.


调用适配器onBindViewHolder方法中的接口方法

public void onBindViewHolder(ViewHolder holder, int position) {
    Upload upload = (Upload) this.uploads.get(position);
    holder.make.setText(upload.getName());
    Glide.with(this.context).load(upload.getUrl()).into(holder.imageView);
    holder.year.setText(upload.getYr());

    holder.mView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            mListener.setViewPager(3) // Calling the interface method
        }
    });
}


您可以像这样设置片段中的ViewPager位置

public void setViewPager(int position){
    viewPager.setCurrentItem(position);
}

相关问题