简体   繁体   中英

After receiving data for BaseAdapter for a ListView, getView returns null

I really need some help because I don't know why the Viewholder is returning null... I'm using a baseAdapter , asynctask to retrive data, but the Listview is crashing.

public class UserGameView extends  AppCompatActivity{

    public UserGameView() {super();}


    private static final String USER_ID = "...";

    private ListView listview ;
    UserBadgesAdapter listAdapter;
    BadgeItemsListLoader badgeItems;


    ArrayList<UserBadges> list = new ArrayList<>();
    protected View mView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // define the view
        int layout = R.layout.fragment_game; //it says fragment but corresponds to view
        // define the view

        setContentView(layout);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

        //ListView
        listview = (ListView) findViewById(R.id.badges);
        listview.setEmptyView(findViewById(R.id.empty_list_item));

        listAdapter = new UserBadgesAdapter(this, list);
        listview.setAdapter(listAdapter);

        badgeItems = new BadgeItemsListLoader();
        badgeItems.execute(USER_ID);
    }



    public class BadgeItemsListLoader extends AsyncTask<String, Void, ArrayList<UserBadges>> {
        @Override
        protected ArrayList<UserBadges> doInBackground(String... params) {
            try {
                return new GameService().getUserBadges(params[0]).execute().body();
            }
            catch (Exception ex){
                ex.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected void onPostExecute(final ArrayList<UserBadges> userBadges) {
            super.onPostExecute(userBadges);
            Log.v(TAG, "Items on post.." + userBadges.toString());

            for (UserBadges userBadge : userBadges) {
                Log.v(TAG, "The badge name is..." + userBadge.getBadge_name());
                Log.v(TAG, "The badge image is..." + userBadge.getBadge_name());
            }

            list = userBadges;
            listAdapter = new UserBadgesAdapter(UserGameView.this,list);
            listview.setAdapter(listAdapter);
            listAdapter.notifyDataSetChanged();

            listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Log.v(TAG, "This is the " + userBadges.get(position).getBadge_name() + " Badge");
                    //Toast.makeText(getApplicationContext(), userBadgesList.get(position).getBadgeName(), Toast.LENGTH_LONG).show();
                }
            });

        }

    }
        static class ViewHolder extends RecyclerView.ViewHolder {
        TextView badge_name;
        ImageView badge_image;
            public ViewHolder(View item) {
                super(item);
                badge_name=(TextView) item.findViewById(R.id.badge_text);
                badge_image=(ImageView) item.findViewById(R.id.badge_image);

            }

            public TextView getBadge_name() {
                return badge_name;
            }

            public void setBadge_name(TextView badge_name) {
                this.badge_name = badge_name;
            }

            public ImageView getBadge_image() {
                return badge_image;
            }

            public void setBadge_image(ImageView badge_image) {
                this.badge_image = badge_image;
            }
        }

    public class UserBadgesAdapter extends BaseAdapter {

        Context  mContext;
        List<UserBadges> bList = new ArrayList<>();
        private ViewHolder holder;

        public UserBadgesAdapter(Context context, ArrayList<UserBadges> arrayList){
            mContext = context;
            bList = arrayList;
        }

        @Override
        public int getCount() {
            return bList.size();
        }

        @Override
        public UserBadges getItem(int position) {
            return bList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View itemView = convertView;
            // create a ViewHolder reference
            ViewHolder holder;
            Log.v(TAG, " True getting  a view");
            if(convertView == null){
                LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                if (inflater != null) {
                    convertView = inflater.inflate(R.layout.list_badges, parent, false);
                }
                holder = new ViewHolder();
                holder.badge_text = (TextView)itemView.findViewById(R.id.badge_text);
                holder.badge_image = (ImageView)itemView.findViewById(R.id.badge_image);
                itemView.setTag(holder);
            }   else {
                // the getTag returns the viewHolder object set as a tag to the view
                holder = (ViewHolder) itemView.getTag();
            }
            UserBadges currentBadge = bList.get(position);
            byte[] bmp = currentBadge.getBadge_image_str().getBytes();
            Bitmap badge_image = BitmapFactory.decodeByteArray(bmp, 0, bmp.length);
            //here comes the null error
            holder.badge_image.setImageBitmap(badge_image);
            holder.badge_text.setText(currentBadge.getBadge_name());
            return convertView;
        }

        public class ViewHolder{
            TextView badge_text;
            ImageView badge_image;

            public TextView getBadge_text() {
                return badge_text;
            }

            public void setBadge_text(TextView badge_text) {
                this.badge_text = badge_text;
            }

            public ImageView getBadge_image() {
                return badge_image;
            }

            public void setBadge_image(ImageView badge_image) {
                this.badge_image = badge_image;
            }

        }

    }
}

The error is...

06-18 12:43:34.719 13310-13310/com.polimi.mep.crowd E/AndroidRuntime: FATAL EXCEPTION: main Process: com.polimi.mep.crowd, PID: 13310 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at com.polimi.mep.crowd.gamification.views.UserGameView$UserBadgesAdapter.getView(UserGameView.java:729)

I've been searching for ages for any guidence I will be very thankful.

In getView() method of Adapter class, if convertView equals to null then you have to inflate layout in itemView object. See below code,

        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            if (inflater != null) {
                // ###################   CHANGE HERE ###########################
                itemView = inflater.inflate(R.layout.list_badges, parent, false);
            }
            holder = new ViewHolder();
            holder.badge_text = (TextView)itemView.findViewById(R.id.badge_text);
            holder.badge_image = (ImageView)itemView.findViewById(R.id.badge_image);
            itemView.setTag(holder);
        }   else {
            // the getTag returns the viewHolder object set as a tag to the view
            holder = (ViewHolder) itemView.getTag();
        }

Thanks.

Use this code, it is working as expected.

View itemView = convertView;
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                itemView = inflater.inflate(R.layout.list_badges, parent, false);
                holder.badge_text = (TextView) itemView.findViewById(R.id.badge_text);
                holder.badge_image = (ImageView) itemView.findViewById(R.id.badge_image);
                itemView.setTag(holder);
            } else {
                holder = (ViewHolder) itemView.getTag();
            }

            UserBadges currentBadge = bList.get(position);
            byte[] bmp = currentBadge.getBadge_image_str().getBytes();
            Bitmap badge_image = BitmapFactory.decodeByteArray(bmp, 0, bmp.length);
            //here comes the null error
            holder.badge_image.setImageBitmap(badge_image);
            holder.badge_text.setText(currentBadge.getBadge_name());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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