簡體   English   中英

自定義列表視圖適配器具有null NullPointerException錯誤

[英]Custom list View adapter have null NullPointerException error

我在應用程序中編程顯示單詞,但我有錯誤:

java.lang.NullPointerException:嘗試在空對象引用上調用虛方法'void android.widget.TextView.setText(java.lang.CharSequence)'

我知道我的錯誤引用了以下的CustomBaseAadpter:

holder.txtWord.setText(rowItem.getword())

但我不知道如何解決。

CustomBaseAdapter.java

public class CustomBaseAdapter extends BaseAdapter {

    Context context;
    private List<item_row_adapter> rowItems;

    public CustomBaseAdapter(Context context, List<item_row_adapter> items) {
        this.context = context;
        this.rowItems = items;
    }

    private class ViewHolder {
        TextView txtWord;
        TextView txtMean;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_view, null);
            holder = new ViewHolder();
            holder.txtWord = (TextView) convertView.findViewById(R.id.word_word);
            holder.txtMean = (TextView) convertView.findViewById(R.id.mean_mean);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        item_row_adapter rowItem = (item_row_adapter) getItem(position);

        holder.txtWord.setText(rowItem.getword());
        holder.txtMean.setText(rowItem.getmean());

        return convertView;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return rowItems.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return rowItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return rowItems.indexOf(getItem(position));
    }
}

item_row_adapter.java

public class item_row_adapter {

    private String word ="";
    private String mean = "";

    public item_row_adapter(String word, String mean) {
        this.word = word;
        this.mean = mean;
    }

    public String getmean() {
        return mean;
    }

    public void setmean(String mean) {
        this.mean = mean;
    }

    public String getword() {
        return word;
    }

    public void setword(String word) {
        this.word = word;
    }

    public String tostring() {
        return mean + "\n" + word;
    }
}

vocab_1_program.java

public class vocab_1_program extends Activity implements OnItemClickListener {

    private ListView listview ;

    public static final String[] Word_item = new String[] { "Strawberry", "Banana", "Orange", "Mixed" };

    public static final String[] Mean_word = new String[] {
            "It is an aggregate accessory fruit",
            "It is the largest herbaceous flowering plant", "Citrus Fruit", "Mixed Fruits" };

    List<item_row_adapter> rowItems;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vocab_1_layout);

        rowItems = new ArrayList<item_row_adapter>();
        for (int i = 0; i < Word_item.length; i++) {
            item_row_adapter item = new item_row_adapter(Word_item[i],
                    Mean_word[i]);
            rowItems.add(item);
        }

        listview = (ListView) findViewById(R.id.listview_view);
        CustomBaseAdapter adapter = new CustomBaseAdapter(this, rowItems);
        listview.setAdapter(adapter);
        listView.setOnItemClickListener((android.widget.AdapterView.OnItemClickListener) this);
    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast toast = Toast.makeText(getApplicationContext(), "Item "
                + (position + 1) + ": " + rowItems.get(position),
                Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
        toast.show();
    }
}

word_row.xml

<TextView
    android:id="@+id/word_word"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center_horizontal"
    android:text="Header"
    android:textColor="@android:color/black" />

<TextView
    android:id="@+id/mean_mean"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center_horizontal"
    android:text="Mean" />

vocab_1_layout.xml

<ListView
    android:id="@+id/listview_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
</ListView>

您正在為該行誇大錯誤的布局。

R.layout.list_view

沒有必要的觀點。 你有它

word_row.xml

在您的CustomBaseAadpter下,在public View getView(int position, View convertView, ViewGroup parent)您正在給沒有所需視圖元素的xml充氣。

方法findViewById()返回與id對應的視圖實例,並存在於膨脹的布局中。 由於你已經誇大了錯誤的布局,並且布局沒有找到視圖,這就是為什么方法findViewById()為視圖返回null。

注意這一行 -

    holder.txtWord = (TextView) convertView.findViewById(R.id.word_word);
    holder.txtMean = (TextView) convertView.findViewById(R.id.mean_mean);

因此這里holder.txtWord= null and holder.txtMean=null ,當你設置你在實例holder.txtWord上調用方法setText()時,它會拋出NPE。

您收到錯誤是因為您已將錯誤的布局誇大到您的CustomBaseAdapter

你已經膨脹了list_view.xml而不是word_row.xml

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) 
    {

        LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.word_row, null);
        holder = new ViewHolder();
        holder.txtWord = (TextView) convertView.findViewById(R.id.word_word);
        holder.txtMean = (TextView) convertView.findViewById(R.id.mean_mean);
        convertView.setTag(holder);
    } else
    {
        holder = (ViewHolder) convertView.getTag();
    }

    item_row_adapter rowItem = (item_row_adapter) getItem(position);

    holder.txtWord.setText(rowItem.getword());
    holder.txtMean.setText(rowItem.getmean());

    return convertView;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM