ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 在SimpleCursorAdapter中的findViewById()时为nullPointer

2019-06-26 19:11:40  阅读:245  来源: 互联网

标签:android android-layout simplecursoradapter listactivity


我正在使用SimpleCursorAdapter和一个xml文件,其中定义了一些视图:

<LinearLayout ...>
    <ImageView android:id="@+id/listIcon" />
    <TextView android:id="@+id/listText" />
</LinearLayout>

我的目的是以编程方式设置TextView的文本颜色和LinearLayout的背景颜色(即ListView中的每一行);颜色从数据库返回.

我在尝试操作TextView时得到了NPE,例如,它发现它没有任何抱怨:

TextView tv = (TextView) findViewById(R.id.listText);
tv.setTextColor(color); // NPE on this line

这是公平的;如果列表中有多个条目,则可以合理地假设“R.id.listText”不起作用.所以我扩展了SimpleCursor适配器:

public View getView(int position, View convertView, ViewGroup parent) {
    View row = super.getView(position, convertView, parent);
    TextView text = (TextView) row.findViewById(R.id.listText);
    // ImageView icon = (ImageView) row.findViewById(R.id.listIcon);

    // If there's an icon defined
    if (mIcon_id != 0) {
        // icon.setImageResource(mIcon_id);
    }

    // If text color defined
    if (mTextColor != 0) {
        text.setTextColor(mTextColor);
    }

    // If background color set
    if (mBackgroundColor != 0) {
        row.setBackgroundColor(mBackgroundColor);
    }
    return(row);
}

我得到两个不同的错误:

>类似的NPE被抛出
“text.setTextColor(mTextColor)”
>如果带有ImageView的行是
没有评论,我得到了
“ClassCastException异常:
android.widget.TextView“我在哪里
调用
“row.findViewById(R.id.listIcon)”

作为参考,我试图使用Commonsware的示例代码,将其应用于我的情况. link (pdf)

改为:

public View getView(int position, View convertView, ViewGroup parent) {
    convertView = super.getView(position, convertView, parent);

    if (convertView == null) convertView = View.inflate(mContext, R.layout.theme_item, null);
    TextView text = (TextView) convertView.findViewById(R.id.listText_tv);
    ImageView icon = (ImageView) convertView.findViewById(R.id.listIcon_iv);

    // If there's an icon defined
    if (mIcon_id != 0) {
        icon.setImageResource(mIcon_id);
    }

    // If text color defined
    if (mTextColor != 0) {
        text.setTextColor(mTextColor);
    }

    // If background color set
    if (mBackgroundColor != 0) {
        convertView.setBackgroundColor(mBackgroundColor);
    }
    bindView(convertView, mContext, mCursor);
    return(convertView);
}

现在我在下一个活动中得到一个ClassCastException(在列表项上单击).在下一个活动中没有修改任何内容;当使用SimpleListAdapter作为具有条目的列表(点击将导致Activity2)时,它工作,所以我认为这仍然是我在这个扩展类中做错了.

解决方法:

convertView永远不是现有的实例;你应该检查它是否为null然后实例化它.如果没有,您可以像改变它一样进行更改.

这应该是这样的:

public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
        convertView = //inflate your row here
    View row = convertView;
    //Manipulate the row here
    return(row);
}

标签:android,android-layout,simplecursoradapter,listactivity
来源: https://codeday.me/bug/20190626/1296850.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有