Java view.setTag(objectobj)抛出nullpointerexception
我正在尝试创建一个具有listview和arrayadapter的应用程序。 我有一个自定义类(Word)和一个自定义适配器(WordAdapter)。 通过运行此代码,应用程序将崩溃 这是错误: java.lang.NullPointerException:尝试调用虚拟方法“void” 空对象引用上的android.view.view.setTag(java.lang.Object)“” 代码如下:Java view.setTag(objectobj)抛出nullpointerexception,java,android,android-studio,Java,Android,Android Studio,我正在尝试创建一个具有listview和arrayadapter的应用程序。 我有一个自定义类(Word)和一个自定义适配器(WordAdapter)。 通过运行此代码,应用程序将崩溃 这是错误: java.lang.NullPointerException:尝试调用虚拟方法“void” 空对象引用上的android.view.view.setTag(java.lang.Object)“” 代码如下: import android.content.Context; import android.
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class WordAdapter extends ArrayAdapter<Word> {
//datastructure to hold two textviews, so that it can be reused rather than instantiating
static class ViewHolder {
TextView textView1;
TextView textView2;
}
//sets up the arrayadapter
//@param context : specify the context (e.g current activity)
//@param words : list of words to populate the view (contains objects of custom word class)
public WordAdapter(@NonNull Context context, @NonNull ArrayList<Word> words) {
super(context, 0, words);
}
/*
Needs to override when using custom arrayadapater.
Called by the adapter class when populating data from data source into the view
@param position : position of the data in the data source
@param convertView : data from source is set as the data for this view
@param parent : parent view to which convertview gets attached
*/
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
View list_item_view = convertView;
//checks if any reusable view is available
//list_item_view = null if no reusable view is available
if (list_item_view == null) {
viewHolder = new ViewHolder();
//convert the custom layout file into view object and inflate the parent with the view
//returns the root of the custom layout file (if attachToRoot = false)
//returns parent view to which the layout is to be attached (if attachToRoot = true)
list_item_view = LayoutInflater.from(getContext())
.inflate(R.layout.list_item, parent, false);
viewHolder.textView1 = (TextView) list_item_view.findViewById(R.id.miwok_text_view);
viewHolder.textView2 = (TextView) list_item_view.findViewById(R.id.default_text_view);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
//get the data from the position
Word word = getItem(position);
//set the miwok word
viewHolder.textView1.setText(word.getMiwokWord());
//set the default word
viewHolder.textView2.setText(word.getDefaultWord());
//retrun the view to which data is to be placed
return list_item_view;
}
}
导入android.content.Context;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类WordAdapter扩展了ArrayAdapter{
//datastructure来保存两个TextView,这样就可以重用它,而不是实例化它
静态类视窗夹{
文本视图文本视图1;
文本视图文本视图2;
}
//设置arrayadapter
//@参数上下文:指定上下文(例如当前活动)
//@param words:填充视图的单词列表(包含自定义单词类的对象)
公共字适配器(@NonNull上下文,@NonNull数组列表字){
超级(上下文,0,单词);
}
/*
使用自定义ArrayAdapter时需要重写。
将数据从数据源填充到视图时由适配器类调用
@参数位置:数据在数据源中的位置
@param convertView:源数据被设置为此视图的数据
@param parent:convertview附加到的父视图
*/
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
持票人持票人;
视图列表\项目\视图=转换视图;
//检查是否有任何可重用视图可用
//如果没有可用的可重用视图,则list\u item\u view=null
if(列表项视图==null){
viewHolder=新的viewHolder();
//将自定义布局文件转换为视图对象,并使用视图对父级进行充气
//返回自定义布局文件的根目录(如果attachToRoot=false)
//返回布局要附加到的父视图(如果attachToRoot=true)
list\u item\u view=LayoutInflater.from(getContext())
.充气(R.layout.list_项,父项,假);
viewHolder.textView1=(TextView)列表项视图.findViewById(R.id.miwok\u文本视图);
viewHolder.textView2=(TextView)列表项视图.findViewById(R.id.default\u文本视图);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
//从位置获取数据
Word=getItem(位置);
//设置miwok单词
viewHolder.textView1.setText(word.getMiwokWord());
//设置默认单词
viewHolder.textView2.setText(word.getDefaultWord());
//重新运行要放置数据的视图
返回列表\项目\视图;
}
}
任何人请帮助。您应该更改以下行:
list_item_view .setTag(viewHolder);
viewHolder = (ViewHolder) list_item_view .getTag();
删除
list\u item\u视图
并仅使用convertView
。谢谢@SandipSoni它成功了