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



我真的需要一些帮助,因为我不知道为什么视图持有人返回 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: Try to invoke virtual method 'android.view.View android.view.View.findViewById(int(' on a null 对象引用 在 com.polimi.mep.crowd.gamification.views.UserGameView$UserBadgesAdapter.getView(UserGameView.java:729(

我一直在寻找任何指南,我将非常感谢。

在适配器类的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();
}

谢谢。

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

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

最新更新