我得到一个空指针异常,在我看来可能与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()的问题外,一切都有效;导致空指针异常。 我不知道如何解决它。
感谢您的帮助!!
答案 0 :(得分:0)
itemAddFriends
ItemViewHolder类的bind方法中的为null。尝试从初始化&#34; List mItemAddFriends&#34;的位置进行调试,并查看它为什么具有空值。