繁体   English   中英

ArrayAdapter getView 返回 NullPointerException -

[英]ArrayAdapter getView returns NullPointerException -

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

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

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

我尝试将layoutInflaternull更改为parentfalse id 不是 false !

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

日志猫:

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)
.......

问题是至少在开始时holdernull的。 card也可能为null但目前尚不清楚。

尽管适配器回收逻辑是正确的,但您忘记将setTag设置为View

回收的逻辑是您滚动的方式(使用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;
}

看到这个代码:

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,则您只是在初始化持有者对象而不是 cardContent。
  • mCards.get(position); 返回空值

您需要将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块中看到,您正在检索标签并将其转换为ViewHolder 如果您尚未设置标签,则getTag()返回 null,从而导致异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM