为什么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 条评论
登录 后参与评论

相关文章

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

为什么max()有时返回nan而有时忽略它?

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

在Activity.onCreate()中,为什么Intent.getExtras()有时返回null?

为什么有时不能仅引用非静态方法?

为什么片段中的getContext()有时会返回null?

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

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

为什么此Powershell函数有时返回列表,而有时返回XmlElement?

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

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

为什么line()并不总是返回线对象?为什么有时似乎返回两倍?

RecyclerView getLayoutParams返回null(有时)

为什么函数有时返回0,有时返回false?

给定的五个函数返回相同的输出有什么区别,特别是为什么有时有时它们不返回?

为什么我的SectionList有时仅呈现一个部分?

为什么有时在使用变量之前将其赋值“ null”

为什么Activity getIntent()。getExtras()有时会返回null?

为什么UI有时无法通过数据绑定在recyclerview中更新?

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

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

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

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

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

Laravel关系“有时”返回null

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

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

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

为什么 PersistentObjectSpace 有时返回一个代理,有时返回一个对象?