java - ArrayAdapter - ViewHolder 空指针错误

标签 java android adapter android-viewholder

我以为我已经掌握了如何使用 ViewHolders,但现在运行此程序时出现空指针异常。当我尝试为其中一个 itemTitleView 设置文本并且我不太明白我缺少什么时,就会发生这种情况。我有三个使用不同背景颜色的布局,并且尝试根据 ArrayList 的特定元素的 listViewItemType 使用每个布局。我用过 Google,但对我来说并不太清楚,任何帮助将不胜感激。

PostItemAdapter.java

public class PostItemAdapter extends ArrayAdapter<Item>
{
    private LayoutInflater inflater;
    private ArrayList<Item> datas;
    public static final int TYPE_short = 0;
    public static final int TYPE_med = 1;
    public static final int TYPE_long = 2;

    public PostItemAdapter(Context context, int textViewResourceId, ArrayList<Item> objects)
    {
        super(context, textViewResourceId, objects);

        inflater = ((Activity) context).getLayoutInflater();
        datas = objects;
    }

    //class to hold view object references
    static class ViewHolder
    {
        TextView itemTitleView;
        TextView itemTitleView1;
        TextView itemTitleView2;
        ImageView itemThumbView;
    }

    @Override
    public int getItemViewType(int position) {
        return datas.get(position).viewtype;
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder viewHolder;
        int listViewItemType = getItemViewType(position);

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.postitem, null);

            viewHolder = new ViewHolder();
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);

            if (listViewItemType == TYPE_short) {
                viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
            } else if (listViewItemType == TYPE_med) {
                viewHolder.itemTitleView1 = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
            } else if (listViewItemType == TYPE_long) {
                viewHolder.itemTitleView2 = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
            }
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (datas.get(position).itemThumbUrl == null)
        {
            viewHolder.itemThumbView.setImageResource(R.drawable.test);
        }

        viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
        viewHolder.itemTitleView1.setText(datas.get(position).itemTitle);
        viewHolder.itemTitleView2.setText(datas.get(position).itemTitle);

        return convertView;
    }
}

最佳答案

在为TextView设置标题时,需要添加if else语句。因为如果 listViewItemType 不等于 TYPE_shortviewHolder.itemTitleView 将为 null

if (listViewItemType == TYPE_short) {
  viewHolder.itemTitleView.setText(datas.get(position).itemTitle);      
} else if (listViewItemType == TYPE_med) {
  viewHolder.itemTitleView1.setText(datas.get(position).itemTitle);      
} else if (listViewItemType == TYPE_long) {
  viewHolder.itemTitleView2.setText(datas.get(position).itemTitle);      
}  

关于java - ArrayAdapter - ViewHolder 空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36257587/

相关文章:

java - PowerMockito - 如何将 whenNew() 与类型列表一起使用?

android - R.anim.slide_out_left 和 R.anim.slide_in_right 的常量值是多少

c# - DbContext 类的 IDbSet 属性的适配器模式

java - 字符串审查

java - @Required 属性检查一个 bean,但不检查另一个 bean

java - Map<String, List<String>> 如果键与字符串形式相同,则在运行时将值添加到列表中

android - 如何在服务中获取 WifiManager 对象?

Android 文本样式错误 - 资源不是 ColorStateList

android - 如何在android中回调后刷新listView(带适配器)

java - 使用列表为我的 RecyclerView 制作了一个自定义适配器