为什么recyclerView的findviewbyposition()有时仅返回null

ste9206

这是我的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{

    View rootView =  inflater.inflate(R.layout.fragment_add_aircraft, container, false);

    recyclerView=(RecyclerView)rootView.findViewById(R.id.recyclerAircraftAdd);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    adapter = new AircraftAdapter(getActivity(),path);
    recyclerView.setAdapter(adapter);
    Button button = (Button)rootView.findViewById(R.id.salvaereo);

    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
          adapter = (AircraftAdapter)recyclerView.getAdapter();
          ParseObject aircraft = new ParseObject("Aircrafts");

           for(int i = 0;i<adapter.getItemCount(); i++)
           {
             if (i== 0)  //first card
             {
                View view = recyclerView.getLayoutManager().findViewByPosition(i);
                ImageView image = (ImageView)view.findViewById(R.id.aircfraftImg);
                image.setDrawingCacheEnabled(true);
                image.buildDrawingCache();
                Bitmap bm = image.getDrawingCache();
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] bytes = stream.toByteArray();
                ParseFile file = new ParseFile("Image.jpg",bytes);
                aircraft.put("aircraft_image",file);

                 file.saveInBackground(new SaveCallback() {
                     @Override
                     public void done(ParseException e) {
                         Log.d("sa","tutto ok");
                     }
                 });

             }
             else if (i ==1) //second card
             {
                 View view = recyclerView.getLayoutManager().findViewByPosition(i);
                 EditText immatricolazione =(EditText)view.findViewById(R.id.immatricolazione);
                 EditText modello = (EditText)view.findViewById(R.id.modello);
                 EditText manifacturer = (EditText)view.findViewById(R.id.manifacturer);
                 EditText categoria = (EditText)view.findViewById(R.id.categoria);
                 EditText classe = (EditText)view.findViewById(R.id.classe);
                 EditText velocita = (EditText)view.findViewById(R.id.velocita);
                 EditText autonomia = (EditText)view.findViewById(R.id.autonomia);
                 EditText consumo = (EditText)view.findViewById(R.id.consumo);
                 EditText posti = (EditText)view.findViewById(R.id.postitotali);
                 EditText costo = (EditText)view.findViewById(R.id.costorario);

                 aircraft.put("re",immatricolazione.getEditableText().toString());
                 aircraft.put("ml",modello.getEditableText().toString());
                 aircraft.put("man",manifacturer.getEditableText().toString());
                 aircraft.put("Aircraft_Type",categoria.getEditableText().toString());
                 aircraft.put("ar",classe.getEditableText().toString());
                 aircraft.put("post",Integer.parseInt(posti.getEditableText().toString()));
                 aircraft.put("meter",Integer.parseInt(consumo.getEditableText().toString()));
                 aircraft.put("speed",Integer.parseInt(velocita.getEditableText().toString()));
                 aircraft.put("prezzi",Float.parseFloat(costo.getEditableText().toString()));
                 aircraft.put("fuel",Integer.parseInt(autonomia.getEditableText().toString()));
             }
             else if(i==2) //third card
             {
                 View view = recyclerView.getLayoutManager().findViewByPosition(i);
                 EditText description = (EditText) view.findViewById(R.id.description);
                 aircraft.put("descrizione", description.getEditableText().toString());

                 aircraft.put("User", ParseUser.getCurrentUser());

                 dialog = ProgressDialog.show(getActivity(), "", "Caricamento aereo in corso...", true);

                 aircraft.saveInBackground(new SaveCallback() {

                     public void done(ParseException e) {
                         dialog.dismiss();

                         if (e == null) {
                             new AlertDialog.Builder(getActivity())
                                     .setMessage("Caricamento aereo avvenuto con successo!")
                                     .setCancelable(false)
                                     .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                         @Override
                                         public void onClick(DialogInterface dialog, int which) {

                                         }
                                     }).create().show();
                         } else {
                             new AlertDialog.Builder(getActivity())
                                     .setMessage("Non è stato possibile caricare l'aereo, riprova più tardi!")
                                     .setCancelable(false)
                                     .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                         @Override
                                         public void onClick(DialogInterface dialog, int which) {

                                         }
                                     }).create().show();
                         }


                     }
                 });
             }
           }

        }
    });

    return rootView;
}

但是有一个问题:如果我为照片充电(第一张卡)并按按钮,它会上传照片,但是如果我写入EditText,它会崩溃并出现以下错误:

流程:com.run.flyproject,PID:10796 java.lang.NullPointerException:尝试在com.run.flyproject的空对象引用上调用虚拟方法'android.view.View android.view.View.findViewById(int)' .Fragments.AddAircraftFragment $ 1.onClick(AddAircraftFragment.java:78)在android.view.View.performClick(View.java:4756)在android.view.View $ PerformClick.run(View.java:19749)在android.os .Handler.handleCallback(Handler.java:739)位于android.os.Handler.dispatchMessage(Handler.java:95)位于android.os.Looper.loop(Looper.java:135)位于android.app.ActivityThread.main(在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller处的java.lang.reflect.Method.invoke(Method.java:372)处的java.lang.reflect.Method.invoke(Native Method)处的ActivityThread.java:5253)。在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)上运行(ZygoteInit.java:899)

zgc7009

并不是说这是一个明确的答案(明确的答案将类似于“您的适配器数量与适配器上可用的视图不一致”之类的东西),但是我的评论可能会有些混乱。你可以做这样的事情...

public class YourAdapter extends RecyclerView.Adapter<YourViewHolder>{

    private boolean mSaveImages = false;
    private SparseArray<Boolean> mImageSavedFlags = new SparseArray<>();

    public void toggleSaveStatus(){
        mSaveImages = !mSaveImages;
    }

    // ... your code

    @Override
    public void onBindViewHolder(YourViewHolder holder, final int position) {
        // Could also manage this in a loop or something
        // in your constructor/when you set your adapter data
        // but this will set our SparseArray
        if(mImageSavedFlags.get(position) == null)
            mImageSavedFlags.put(position, false);

        // ... your code
        if(mSaveImages && !mImageSavedFlags.get(position){
            // ... save your image
            mImageSavedFlags.put(position, true);
        }
    }

    // ... your code
}

这样,无论何时尝试绑定视图,都可以检查是否要保存ImageViews源,如果尚未保存,则可以保存源并更新SparseArray。

要切换您的状态,只需执行以下操作

button.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v){
        adapter.toggleSaveStatus();
    }
}

值得注意的是,这只会打开保存设置后才保存您实际滚动到的图像我想您可以强制滚动RecyclerView,但这会引起其他问题。

同样重要的是要认识到,如果您正在执行诸如基于位置从URL或可绘制对象中加载图像之类的操作,则实际上并不需要ImageView来加载源,然后再保存它,因此有很多一种方法(包括库)来保存尚未显式加载到您的应用程序中的图像,这将完全消除在此过程中包括适配器的需要。

我确信这不是执行此操作的唯一方法,并且我确信这不是最佳答案,但是我的评论再次变得有些混乱。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么recyclerView的findviewbyposition()有时仅返回null

来自分类Dev

为什么在RecyclerView中,findViewByPosition()在EditText上返回null

来自分类Dev

为什么量角器有时返回承诺,有时返回值?

来自分类Dev

为什么datetime对象有时返回日期,有时返回日期和时间?

来自分类Dev

为什么导航属性有时会返回null?

来自分类Dev

为什么open(“ url”)有时返回File有时是StringIO?

来自分类Dev

为什么instanceof有时不编译,有时返回false?

来自分类Dev

Laravel-为什么json响应有时返回数组有时是对象

来自分类Dev

为什么Ruby Procs有时会返回而有时却是错误?

来自分类Dev

为什么Ruby Array切片有时返回nil,有时返回空Array?

来自分类Dev

NSDateFormatter dateFromString有时返回null

来自分类Dev

Laravel关系“有时”返回null

来自分类常见问题

为什么有时仅将memcmp(a,b,4)优化为uint32比较?

来自分类Dev

为什么ARC有时仅保留__block out指针?

来自分类Dev

为什么Groovy有时有时不需要方法的返回类型(甚至def)?

来自分类Dev

为什么Class.getSuperclass()有时返回Object.class?

来自分类Dev

为什么有时在泛型方法的定义中省略了返回类型之前的尖括号

来自分类Dev

为什么读书千分尺测量返回NaN有时?

来自分类Dev

为什么这个随机生成器有时返回3位而不是4位?

来自分类Dev

为什么有时允许返回None的re.match上允许使用group方法?

来自分类Dev

为什么ASP.NET MVC有时返回错误状态代码500,有时返回错误状态代码404

来自分类Dev

将来调用api的方法有时返回null有时不返回

来自分类Dev

为什么Clang有时会返回nullptr,有时会返回我想要的?

来自分类Dev

为什么JavaScript有时会将null转换为空字符串,有时又将其转换为“ null”字符串?

来自分类Dev

为什么整数属性有时会返回0?

来自分类Dev

当代码有效时,为什么 JQuery .val() 方法有时会返回 undefined?

来自分类Dev

如何自定义AutoFixture有时返回Null

来自分类Dev

Android相机意图返回null ...有时

来自分类Dev

pyspark unix_timestamp有时返回null

Related 相关文章

  1. 1

    为什么recyclerView的findviewbyposition()有时仅返回null

  2. 2

    为什么在RecyclerView中,findViewByPosition()在EditText上返回null

  3. 3

    为什么量角器有时返回承诺,有时返回值?

  4. 4

    为什么datetime对象有时返回日期,有时返回日期和时间?

  5. 5

    为什么导航属性有时会返回null?

  6. 6

    为什么open(“ url”)有时返回File有时是StringIO?

  7. 7

    为什么instanceof有时不编译,有时返回false?

  8. 8

    Laravel-为什么json响应有时返回数组有时是对象

  9. 9

    为什么Ruby Procs有时会返回而有时却是错误?

  10. 10

    为什么Ruby Array切片有时返回nil,有时返回空Array?

  11. 11

    NSDateFormatter dateFromString有时返回null

  12. 12

    Laravel关系“有时”返回null

  13. 13

    为什么有时仅将memcmp(a,b,4)优化为uint32比较?

  14. 14

    为什么ARC有时仅保留__block out指针?

  15. 15

    为什么Groovy有时有时不需要方法的返回类型(甚至def)?

  16. 16

    为什么Class.getSuperclass()有时返回Object.class?

  17. 17

    为什么有时在泛型方法的定义中省略了返回类型之前的尖括号

  18. 18

    为什么读书千分尺测量返回NaN有时?

  19. 19

    为什么这个随机生成器有时返回3位而不是4位?

  20. 20

    为什么有时允许返回None的re.match上允许使用group方法?

  21. 21

    为什么ASP.NET MVC有时返回错误状态代码500,有时返回错误状态代码404

  22. 22

    将来调用api的方法有时返回null有时不返回

  23. 23

    为什么Clang有时会返回nullptr,有时会返回我想要的?

  24. 24

    为什么JavaScript有时会将null转换为空字符串,有时又将其转换为“ null”字符串?

  25. 25

    为什么整数属性有时会返回0?

  26. 26

    当代码有效时,为什么 JQuery .val() 方法有时会返回 undefined?

  27. 27

    如何自定义AutoFixture有时返回Null

  28. 28

    Android相机意图返回null ...有时

  29. 29

    pyspark unix_timestamp有时返回null

热门标签

归档