【问题标题】:ArrayAdapter getView returns NullPointerException -ArrayAdapter getView 返回 NullPointerException -
【发布时间】:2020-04-09 03:36:22
【问题描述】:

我是 android 新手,我尝试了很多解决方案,但没有任何效果!

你能看看我的代码有什么问题吗:

我在holder.CardContent.setText(card.getString("content")); 中得到NullPointerException

我尝试将 layoutInflaternull 更改为 parent, false id 不是假的!

CardAdapter.java

public class CardAdapter extends ArrayAdapter<ParseObject> {
    protected Context mContext;
    protected List<ParseObject> mCards;

    public CardAdapter(Context context, List<ParseObject> cards) {
        super(context, R.layout.card_item, cards);

        mContext = context;
        mCards = cards;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, null);
            holder = new ViewHolder();

            holder.CardContent = (TextView) convertView.findViewById(R.id.cardText);
        } else{
            holder = (ViewHolder) convertView.getTag();
        }

        ParseObject card = mCards.get(position);

        holder.CardContent.setText(card.getString("content")); // <-- NPE here.

        return convertView;
    }

    private static class ViewHolder{
        TextView CardContent;
    }
}

Logcat:

at com.kardapps.lifehacks.activities.CardAdapter.getView(CardAdapter.java:64)
at android.widget.AbsListView.obtainView(AbsListView.java:2255)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
at android.widget.ListView.onMeasure(ListView.java:1175)
.......

【问题讨论】:

  • @NamelessOne 你的链接完全不相关

标签: java android nullpointerexception android-arrayadapter


【解决方案1】:

问题是holder 至少在开始时是nullcard 也可以是 null,但目前还不清楚。

虽然适配器回收逻辑是对的,但你忘记了setTagView

回收的逻辑是你滚动的方式你保存(使用setTag)已经读取/看到的数据到视图(这里是convertView)。

然后每次通过相同的位置时,您使用setTag 检索它们而不是重新创建它们 (LayoutInflater.from...)

@Override
public View getView(int position, @Nullable View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        //                      This is not an error but using parent you avoid Lint warnings 
        convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, parent); 
        holder = new ViewHolder();

        holder.CardContent = (TextView) convertView.findViewById(R.id.cardText);
        convertView.setTag(holder); // <-- As suggested for improvement
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    ParseObject card = mCards.get(position);

    holder.CardContent.setText(card.getString("content")); // <-- NPE here.

    // convertView.setTag(holder); // <-- This line is missing
    return convertView;
}

【讨论】:

  • 我认为 convertView.setTag(holder);应该在@Mike M提到的if块内
  • 有可能!当它已经设置时设置它是非常多余的。我会改的。
【解决方案2】:

您需要将convertView 的标签设置为if-block 中的holder

if (convertView == null) {
    convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, null);
    holder = new ViewHolder();

    holder.CardContent = (TextView) convertView.findViewById(R.id.cardText);

    // Add this line
    convertView.setTag(holder);
}

您可以在else-block 中看到,您正在检索标签并将其转换为ViewHolder。如果没有设置标签,getTag() 会返回 null,导致 Exception。

【讨论】:

    【解决方案3】:

    查看此代码:

    if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, null);
            holder = new ViewHolder();
            holder.CardContent = (TextView) convertView.findViewById(R.id.cardText);
        }
        else{
            holder = (ViewHolder) convertView.getTag();
        }
        ParseObject card = mCards.get(position);
        holder.CardContent.setText(card.getString("content"));
    

    两种可能:

    • 如果 convertView 不为 null,则您只是在初始化 holder 对象而不是 cardContent。
    • mCards.get(position); 返回 null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多