简体   繁体   English

滚动列表视图时应用崩溃

[英]App is crashing while scrolling the listview

In my app I'm showing data in listview. 在我的应用程序中,我正在列表视图中显示数据。 While scrolling through listview my app is crashing. 在列表视图中滚动时,我的应用程序崩溃了。 What changes should I make? 我应该做些什么改变?

as given in the error my RecipeListFragment.java file is: 如错误所示,我的RecipeListFragment.java文件为:

public class RecipeListFragment extends Fragment {
    MyDatabase db ;
    boolean isfav = false;
    Context context;
    ListView lvrecipe;
    ArrayList<RecipePojo> recipelist = new ArrayList<RecipePojo>();

    LinearLayout ll;
    ImageView fav_unfav;
    DisplayImageOptions options;
    private ProgressDialog progress;
    ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
    int counter=8;

    int position;

    String recipeid;

    int checkcounter = 0;

    private Custom_Adapter adapter;

    public RecipeListFragment() {

    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_recipe_list_actvity, container,false);
        context=getActivity();

        lvrecipe = (ListView)rootView.findViewById(R.id.lvrecipe);

        new getrecipe().execute();

        db = new MyDatabase(getActivity());

        position = DataManager.selectedposition;
        adapter = new Custom_Adapter(getActivity());
        adapter.notifyDataSetChanged();
        lvrecipe.setAdapter(adapter);


        lvrecipe.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,int position, long id) {

                DataManager.selectedposition = position;
                Intent i = new Intent(getActivity(), RecipeDescription.class);
                i.putExtra("cusinename", DataManager.cusinename);               
                startActivity(i);
                getActivity().finish();
            }
        });

        return rootView;
    }   


    @Override
    public void onResume() {
        super.onResume();
    }


    public class Custom_Adapter extends BaseAdapter  {

        private LayoutInflater mInflater;

        public Custom_Adapter(Context c) {
            mInflater = LayoutInflater.from(c);
        }

        @Override
        public int getCount() {
            if(recipelist!=null){
                return recipelist.size();
            }else{
                return 0;
            }
        }

        @Override
        public Object getItem(int position) {
            if(recipelist!=null){
                return recipelist.get(position);
            }else{
                return 0;
            }
        }

        @Override
        public long getItemId(int position) {
            if(recipelist!=null){
            return position;
            }else{
                return 0;
            }
        }

        @SuppressWarnings("deprecation")
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {

                convertView = mInflater.inflate(R.layout.recipelist, null);

                holder = new ViewHolder();
                holder.txttile = (TextView) convertView.findViewById(R.id.txttile);
                holder.imgrecipe = (ImageView) convertView.findViewById(R.id.imgrecipe);
                holder.fav_unfav = (ImageView) convertView.findViewById(R.id.fav_unfav);
                holder.ratingbar = (RatingBar) convertView.findViewById(R.id.ratingbar);
                convertView.setTag(holder);

            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            if(recipelist!=null){
               recipeid = recipelist.get(position).getRecipeid();
               checkcounter = db.checkrecipefav(recipeid);
             }              

            if(checkcounter > 0) {
                isfav = true;
            } else {
                isfav = false;
            }

            db.close();

            if(isfav){              
                holder.fav_unfav.setBackgroundDrawable(getResources().getDrawable(R.drawable.favourite));
            }
            else{           
                holder.fav_unfav.setBackgroundDrawable(getResources().getDrawable(R.drawable.favourites));
            }

            Typeface face1 = Typeface.createFromAsset(getActivity().getAssets(),"sinkin_sans_300_light.ttf");
            Typeface face2 = Typeface.createFromAsset(getActivity().getAssets(),"sinkin_sans_400_regular.ttf");

            holder.txttile.setTypeface(face2);
            //  holder.txtduration.setTypeface(face1);

            holder.txttile.setText(recipelist.get(position).getRecipename());

            try{                
                String [] prep=recipelist.get(position).getPrep_time().split(" ");
                String [] cook=recipelist.get(position).getCooking_time().split(" ");   

                int totalTime=Integer.parseInt(prep[0])+Integer.parseInt(cook[0]);
            }catch(NumberFormatException e){
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }

            String url = DataManager.photourl+"recipe/"+recipelist.get(position).getRecipeid()+".jpg";

            try {
                url = URLDecoder.decode(url, "UTF-8");
                url = url.replaceAll(" ", "%20");               
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }

            if(recipelist.get(position).getVideo_link().equals("none"))
            {

            }

            String rating = recipelist.get(position).getRatings();

            if(rating!=null && rating.trim().length() > 0)
            {
                holder.ratingbar.setRating(Float.valueOf(rating));
            }   


            if(holder.imgrecipe!=null){

            if (url != null && url.trim().length() > 0)
            {

                final ImageView imageView = holder.imgrecipe;
                //final RelativeLayout imgRL = holder.imageRL;

                ImageLoader.getInstance().displayImage(url, holder.imgrecipe,options, new SimpleImageLoadingListener()
                {
                    @Override
                    public void onLoadingComplete(String imageUri,
                        View view, Bitmap loadedImage)
                    {
                        super.onLoadingComplete(imageUri, view, loadedImage);
                        imageView.setAdjustViewBounds(true);
                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,FailReason failReason) {
                        super.onLoadingFailed(imageUri, view, failReason);
                    }

                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        super.onLoadingStarted(imageUri, view);
                    }
                });

            } else {}

        }

        return convertView;
    }   

    class ViewHolder {
        TextView txttile;
        ImageView imgrecipe;
        ImageView fav_unfav;
        RatingBar ratingbar;
    }
}

public class getrecipe extends AsyncTask<String, Void, String> {
    boolean response = false;

    @Override
    protected void onPreExecute() {
        //progress = ProgressDialog.show(context, "Getting Data...","Please wait....");

        progress = new ProgressDialog(getActivity());
        progress.setMessage("Please wait....");
        progress.show();
    }

    @Override
    protected String doInBackground(String... params) {
        response = APIManager.getrecipebycusine(DataManager.CUISINE_ID);

        return "";
    }

    @Override
    protected void onPostExecute(String result) {

        progress.cancel();
        if (response) {

            if (DataManager.status.equalsIgnoreCase("1")) {
                recipelist = DataManager.recipelist;
                adapter.notifyDataSetChanged();
                //Intent i = new Intent(getActivity(),RecipeListActvity.class);

                //startActivity(i);

            } else {
                connectionerror();
            }
        } else {
            connectionerror();
        }
    }

    @Override
    protected void onProgressUpdate(Void... values) {

    }
}

    public void alert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());

        alertDialog.setTitle("No Recipe!");

        alertDialog.setMessage("No Recipe for this Cusine");

        alertDialog.setPositiveButton("OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                }
            });

        alertDialog.show();
    }

    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }

    public void connectionerror() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());

        alertDialog.setTitle("Error!");

        alertDialog.setMessage("Connection Lost ! Try Again");

        alertDialog.setPositiveButton("Retry",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    new getrecipe().execute();

                }
            });

        alertDialog.show();
    }
}   

The errors that is showing in Crashlytics is: Crashlytics中显示的错误是:

   Fatal Exception: java.lang.NumberFormatException: Invalid float: ""
   at java.lang.StringToReal.invalidReal(StringToReal.java:63)
   at java.lang.StringToReal.initialParse(StringToReal.java:176)
   at java.lang.StringToReal.parseFloat(StringToReal.java:323)
   at java.lang.Float.parseFloat(Float.java:306)
   at java.lang.Float.valueOf(Float.java:343)
   at com.raccoonfinger.glutenfree.RecipeListFragment$Custom_Adapter.getView(Unknown Source)
   at android.widget.AbsListView.obtainView(AbsListView.java:2344)
   at android.widget.ListView.makeAndAddView(ListView.java:1864)
   at android.widget.ListView.fillDown(ListView.java:698)
   at android.widget.ListView.fillGap(ListView.java:662)
   at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
   at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4512)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
   at android.view.Choreographer.doCallbacks(Choreographer.java:580)
   at android.view.Choreographer.doFrame(Choreographer.java:549)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5312)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

I think you get error on below Line. 我认为您在Line以下出现错误。

holder.ratingbar.setRating(Float.valueOf(rating));

This means the value inside "rating" is string, please check. 这意味着“ rating”中的值为字符串,请检查。

如果ur的值为String,则设置Rating为float值:

 holder.ratingbar.setRating(Float.parseFloat(rating));

use parseFloat() 使用parseFloat()

holder.ratingbar.setRating(Float.parseFloat(rating));

inplace of 代替

holder.ratingbar.setRating(Float.valueOf(rating));

I'm not sure where you are getting the value of rating. 我不确定您从哪里获得评价的价值。 But it is attempting to parse that value of string to Float that is throwing your error. 但是它试图将字符串的值解析为Float,从而引发错误。

String rating = recipelist.get(position).getRatings();

Also check that the string is not empty. 还要检查字符串是否为空。

// if(rating!=null && rating.trim().length() > 0)
if(rating!=null && !rating.isEmpty() && rating.trim().length() > 0)
{
    try{
        holder.ratingbar.setRating(Float.valueOf(rating));
    }
    catch (NumberFormatException e){
        // TO DO    
    }
}  

Firstly examine the value of rating (log it) and if you are getting a float in there I suggest having a look at this answer : 首先检查一下等级的值(将其记录下来),如果您在那里浮动,我建议您看一下此答案

float f = Float.valueOf("> 12.4N-m/kg.".replaceAll("[^\\d.]+|\\.(?!\\d)", ""));

response of this method should be float String rating = recipelist.get(position).getRatings(); 此方法的响应应为float String rating = recipelist.get(position).getRatings(); or to get it in String you have to convert it into String by using toString(); 或将其转换为String,您必须使用toString();将其转换为String toString(); thats why you are getting NumberFormatException 多数民众赞成在为什么你得到NumberFormatException

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM