RecyclerView:onBindViewHolder上的空对象引用item.get(position)

时间:2017-02-16 14:09:15

标签: java android database nullpointerexception android-recyclerview

我得到一个空指针异常,在我看来可能与onBindViewHolder()方法有关,因为我认为我在调用mItemAddFriends.get(position)时得到一个空对象;您可以在下面看到我的代码和类。

错误日志:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.pmp_vip.personachat.ItemAddFriends.getUsername()' on a null object reference
                  at com.pmp_vip.personachat.ItemViewHolder.bind(ItemViewHolder.java:19)
                  at com.pmp_vip.personachat.RVAdapter$override.onBindViewHolder(RVAdapter.java:31)

...

我的班级:

  • RVAdapter类:

    public class RVAdapter extends RecyclerView.Adapter<ItemViewHolder> {
        private List<ItemAddFriends> mItemAddFriends;
    
        public RVAdapter(List<ItemAddFriends> mItemAddFriends) {
            this.mItemAddFriends = mItemAddFriends;
        }
    
        public void setmItemAddFriends(List<ItemAddFriends> mItemAddFriends{
            this.mItemAddFriends = mItemAddFriends;
        }
    
        @Override
        public ItemViewHolder onCreateViewHolder(ViewGroup parent, int        viewType) {
            View view =        LayoutInflater.from(parent.getContext()).inflate(R.layout.item_add_friends,   parent, false);
            return new ItemViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(ItemViewHolder itemViewHolder, int   position) {
            final ItemAddFriends item = mItemAddFriends.get(position);
            itemViewHolder.bind(item);
        }
    
        @Override
        public int getItemCount() {
            return mItemAddFriends.size();
        }   
    
        public void setFilter(List<ItemAddFriends> itemAddFriends) {
            mItemAddFriends = new ArrayList<>();
            mItemAddFriends.addAll(itemAddFriends);
            notifyDataSetChanged();
        }
    }
    
  • ItemViewHolder类:

    public class ItemViewHolder extends RecyclerView.ViewHolder {
        public TextView username_textView;
        public TextView name_textView;
    
        public ItemViewHolder(View view) {
            super(view);
    
            username_textView = (TextView)   view.findViewById(R.id.item_username);
            name_textView = (TextView) view.findViewById(R.id.item_name);
        }
    
        public void bind(ItemAddFriends itemAddFriends) {
            username_textView.setText(itemAddFriends.getUsername());
            name_textView.setText(itemAddFriends.getName());
        }
    }
    
  • AddFriendsActivity类:

    public class AddFriendsActivity extends AppCompatActivity implements     SearchView.OnQueryTextListener {
    
        private RecyclerView recyclerView;
        private List<ItemAddFriends> mItemAddFriends;
        private RVAdapter adapter;
    
        private static final String SERVER_ADDRESS = "http://10.0.2.2/";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_friends);
    
           getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
            mItemAddFriends = new ArrayList<>();
    
            recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(layoutManager);
            adapter = new RVAdapter(mItemAddFriends);
            recyclerView.setAdapter(adapter);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.add, menu);
            final MenuItem item = menu.findItem(R.id.action_add);
            final SearchView searchView = (SearchView)       MenuItemCompat.getActionView(item);
            searchView.setMaxWidth(Integer.MAX_VALUE);
             searchView.setQueryHint(getResources().getString(R.string.e_username));
            searchView.setIconified(false);
            searchView.setOnQueryTextListener(this);
            searchView.setOnCloseListener(new SearchView.OnCloseListener() {
                @Override
                public boolean onClose() {
                    finish();
                    return true;
                }
            });
    
            MenuItemCompat.setOnActionExpandListener(item,
                    new MenuItemCompat.OnActionExpandListener() {
                        @Override
                        public boolean onMenuItemActionCollapse(MenuItem item) {
                            adapter.setFilter(mItemAddFriends);
                            return true;
                        }
    
                        @Override
                        public boolean onMenuItemActionExpand(MenuItem item)   {
                            return true;
                        }
                    });
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    finish();
                    return true;
                default:
                    return super.onOptionsItemSelected(item);
            }
        }
    
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }
    
        @Override
        public boolean onQueryTextChange(String newText) {
            final List<ItemAddFriends> filteredItemList =  filter(mItemAddFriends, newText);
            adapter.setmItemAddFriends(filteredItemList);
            adapter.setFilter(filteredItemList);
            return true;
        }
    
        private List<ItemAddFriends> filter(List<ItemAddFriends> list,  String query) {
            query = query.toLowerCase();
            final List<ItemAddFriends> filteredItemList = new ArrayList<>();
    
            SearchUser searchUser = new SearchUser(query);
            searchUser.execute();
            filteredItemList.add(searchUser.getItemAddFriends());
    
           return filteredItemList;
        }
    
        private class SearchUser extends AsyncTask<Void, Void, Void> {
    
            String query;
            ItemAddFriends itemAddFriends;
    
            public SearchUser(String query) {
                this.query = query;
            }
    
            public ItemAddFriends getItemAddFriends() {
                return itemAddFriends;
            }
    
            @Override
            protected Void doInBackground(Void... params) {
                String jsonData = "";
                String result = "";
                JSONObject object = null;
    
                try {
                    OkHttpClient client = new OkHttpClient();
    
                    FormBody.Builder builder = new FormBody.Builder()
                            .add("query", query);
    
                    RequestBody formBody = builder.build();
    
                    Request request = new Request.Builder()
                            .url(SERVER_ADDRESS + "search.user.php")
                            .post(formBody)
                            .build();
    
                    Response responses = null;
    
                    try {
                        responses = client.newCall(request).execute();
                        jsonData = responses.body().string();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                    try {
                        JSONObject Jobject = new JSONObject(jsonData);
                        JSONArray Jarray = Jobject.getJSONArray("users");
    
                        for (int i = 0; i < Jarray.length(); i++) {
                            object = Jarray.getJSONObject(i);
                            result = object.getString("firstname");
                       }
    
                   } catch (JSONException e) {
                        e.printStackTrace();
                   }
                } catch (Exception e){
                   e.printStackTrace();
                }
    
                itemAddFriends = new ItemAddFriends(result, result);
    
                return null;
            }
        }
    }
    

我认为除了ItemViewHolder类name_textView.setText(itemAddFriends.getName())中方法bind()的问题外,一切都有效;导致空指针异常。 我不知道如何解决它。

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

itemAddFriends
ItemViewHolder类的bind方法中的

为null。尝试从初始化&#34; List mItemAddFriends&#34;的位置进行调试,并查看它为什么具有空值。