Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android notifyDatasetChanged上的NullPointer异常使用自定义适配器_Android - Fatal编程技术网

Android notifyDatasetChanged上的NullPointer异常使用自定义适配器

Android notifyDatasetChanged上的NullPointer异常使用自定义适配器,android,Android,这是我关于堆栈溢出的第一篇文章,如果让人困惑,我深表歉意 我在onClick方法中的foodListAdapter.notifyDatasetChanged()上获得nullpointer 我正在使用自定义适配器。我的onClick方法在下面的MainActivity类中。另外,请注意,如果我在onClick方法中注释掉foodListAdapter.notifyDataSetChanged并取消注释掉其他3行,那么我的代码工作正常。但我认为这不是最干净的方式 public class Main

这是我关于堆栈溢出的第一篇文章,如果让人困惑,我深表歉意

我在onClick方法中的foodListAdapter.notifyDatasetChanged()上获得nullpointer

我正在使用自定义适配器。我的onClick方法在下面的MainActivity类中。另外,请注意,如果我在onClick方法中注释掉foodListAdapter.notifyDataSetChanged并取消注释掉其他3行,那么我的代码工作正常。但我认为这不是最干净的方式

public class MainActivity extends Activity implements View.OnClickListener
{
    Button mainButton;
    ListView mainListView;
    ArrayAdapter spinnerDataAdapter;
    FoodListAdapter foodListAdapter;
    ArrayList newFoodList = new ArrayList();
    ShareActionProvider mShareActionProvider;
    private static final String PREFS = "prefs";
    private static final String PREF_NAME = "name";
    SharedPreferences mSharedPreferences;
    Spinner mainSpinner;
    TextView foodTextView;
    CharSequence currentDate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Access button in activity_main and set onClickListener
        mainButton = (Button) findViewById(R.id.main_button);
        mainButton.setOnClickListener(this);

        //Access edit text in activity_main
        foodTextView = (TextView) findViewById(R.id.food_textview);

        //Access list view in activity_main
        mainListView = (ListView) findViewById(R.id.main_listview);
        mainSpinner = (Spinner) findViewById(R.id.main_spinner);
        View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null);

        //Create an array foodListAdapter for the spinner
        spinnerDataAdapter =  ArrayAdapter.createFromResource(this, R.array.food_types, android.R.layout.simple_spinner_item);
        mainSpinner.setAdapter(spinnerDataAdapter);

        //Set this listview to react to items being pressed
        // mainListView.setOnItemClickListener(this);

        //Greet the user or ask for their name if they are new
        displayWelcome();

        //create food list and create foodListAdapter then set the foodListAdapter
        newFoodList.add(new FoodItem(R.drawable.ic_chicken, "Chicken"));

        FoodListAdapter adapter = new FoodListAdapter(this,
                R.layout.listview_item_row, newFoodList);

        mainListView.addHeaderView(header);
        mainListView.setAdapter(adapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        //Access the Share Item defined in the menu XML
        MenuItem shareItem = menu.findItem(R.id.menu_item_share);

        //Access the object responsible for
        //putting together the sharing submenu
        if(shareItem !=null) {
            mShareActionProvider = (ShareActionProvider)shareItem.getActionProvider();
        }


        return true;
    }

    public CharSequence getFormattedDate(){
    Date d = new Date();
    CharSequence s  = DateFormat.format("MMMM d, yyyy ", d.getTime());
    return s;
    }
    @Override
    public void onClick(View v) {
        currentDate = getFormattedDate();
        foodTextView.setText(mainSpinner.getSelectedItem().toString());
        newFoodList.add(new FoodItem(R.drawable.ic_chicken, mainSpinner.getSelectedItem().toString() + " was stored on: " + currentDate ));
        foodListAdapter.notifyDataSetChanged();
       // FoodListAdapter foodListAdapter = new FoodListAdapter(this,
              // R.layout.listview_item_row, newFoodList);
       // mainListView.setAdapter(foodListAdapter);

    }
下面是我的完整自定义适配器代码:

package com.vintage.freshulator;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class FoodListAdapter extends ArrayAdapter<FoodItem> {

    Context context;
    int layoutResourceId;
    ArrayList<FoodItem> data;

    public FoodListAdapter(Context context, int layoutResourceId, ArrayList data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        FoodListHolder holder = null;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new FoodListHolder();
            holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
            holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);

            row.setTag(holder);
        }
        else
        {
            holder = (FoodListHolder)row.getTag();
        }

        FoodItem foodItem = data.get(position);
        holder.txtTitle.setText(foodItem.title);
        holder.imgIcon.setImageResource(foodItem.icon);

        return row;
    }

    static class FoodListHolder
    {
        ImageView imgIcon;
        TextView txtTitle;
    }
}
package com.vintage.freshulator;
导入android.app.Activity;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类FoodListAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
阵列列表数据;
公共FoodListAdapter(上下文上下文、int-layoutResourceId、ArrayList数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
FoodListHolder=null;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新的FoodListHolder();
holder.imgIcon=(ImageView)row.findViewById(R.id.imgIcon);
holder.txtTitle=(TextView)row.findViewById(R.id.txtTitle);
row.setTag(支架);
}
其他的
{
holder=(FoodListHolder)行。getTag();
}
FoodItem FoodItem=data.get(位置);
holder.txtTitle.setText(foodItem.title);
holder.imgIcon.setImageResource(foodItem.icon);
返回行;
}
静态类FoodListHolder
{
ImageView imgIcon;
TextView-txtTitle;
}
}
使用


用于创建
FoodListAdapter
对象。由于
foodListAdapter
为空(创建
foodListAdapter
的新
adapter
对象)而获取空指针异常。

您的
foodListAdapter
为空,因为您正在使用
adapter
初始化它,并使用
foodListAdapter
使用
notifyDatasetChanged
,因此 改变


首先,您使用的变量以后将无法通过其他方法访问。而是在
onCreate
中创建适配器,如下所示:

foodListAdapter = new FoodListAdapter(this, R.layout.listview_item_row,
        newFoodList);
mainListView.setAdapter(foodListAdapter);
foodListAdapter.data.add(new FoodItem(R.drawable.ic_chicken, 
    mainSpinner.getSelectedItem().toString()+" was stored on: "+currentDate));
foodListAdapter.notifyDataSetChanged();
其次,在活动中更改数组不会在适配器内部更改它。因此,将适配器内部的
数据
变量设置为公共:

public ArrayList<FoodItem> data;

u r使用foodListAdapter.notifyDataSetChanged();在设置适配器之前…该死,太快了,谢谢!在时间允许的时候会接受的。
foodListAdapter = new FoodListAdapter(this, R.layout.listview_item_row,
        newFoodList);
mainListView.setAdapter(foodListAdapter);
public ArrayList<FoodItem> data;
foodListAdapter.data.add(new FoodItem(R.drawable.ic_chicken, 
    mainSpinner.getSelectedItem().toString()+" was stored on: "+currentDate));
foodListAdapter.notifyDataSetChanged();