收到ListView的BaseAdapter数据后,getView返回null

时间:2018-06-18 11:12:46

标签: java android listview nullpointerexception baseadapter

我真的需要一些帮助,因为我不知道为什么Viewholder返回null ...我使用baseAdapterasynctask来检索数据,但是Listview崩溃了。

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;
            }

        }

    }
}

错误是......

  

06-18 12:43:34.719 13310-13310 / com.polimi.mep.crowd E / AndroidRuntime:   致命异议:主要                                                                         过程:com.polimi.mep.crowd,PID:13310                                                                         java.lang.NullPointerException:尝试调用虚方法   'android.view.View android.view.View.findViewById(int)'上的null   对象参考                                                                             在   com.polimi.mep.crowd.gamification.views.UserGameView $ UserBadgesAdapter.getView(UserGameView.java:729)

我一直在寻找适合任何指导的年龄,我将非常感谢。

2 个答案:

答案 0 :(得分:0)

在Adapter类的 getView()方法中,如果convertView等于null,则必须在 itemView 对象中扩充布局。见下面的代码,

        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();
        }

感谢。

答案 1 :(得分:0)

使用此代码,它按预期工作。

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());