Android Studio - я не могу понять, что заставляет мой StringArray возвращать исключение NullPointerException, поскольку он регистрируется как инициализированный и заполненный - PullRequest
0 голосов
/ 10 октября 2019

Попытка использовать адаптер, но он выдает ошибку нулевого указателя.

Я не могу понять, почему, поскольку регистрация содержимого массива строк показывает, что он был инициализирован и не является нулевым.

MainActivity.java

    public class MainActivity extends AppCompatActivity {

    ListView lvMyListView;
    String[] items;

    ///tag for log
    private static final String tag = "**IS4447**";

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

        Resources res = getResources();

        //init list view
        lvMyListView = (ListView) findViewById(R.id.lvMyListView);

        items = res.getStringArray(R.array.items);

        Log.d(tag, items.toString());

        ItemAdapter itemAdapter = new ItemAdapter(this, items);
        lvMyListView.setAdapter(itemAdapter);




        }
    }

ItemAdapter.java

    public class ItemAdapter extends BaseAdapter {

    String[] items;
    LayoutInflater mInflater;

    public ItemAdapter(Context c, String[] i){
        i = items;

        mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return items.length;
    }

    @Override
    <resources>
    public Object getItem(int i) {
        return items[i];
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View convertView, ViewGroup parent) {

        View v = mInflater.inflate(R.layout.my_list_view_detail, null);
        TextView tvName = v.findViewById(R.id.tvName);

        String itemName = items[i];

        tvName.setText(itemName);

        return null;
        }
    }

strings.xml

    <resources>
    <string name="app_name">My List View App</string>

<!--    My List View Data-->

    <string-array name="items">
        <item>Apple</item>
        <item>Orange</item>
        <item>Banana</item>
    </string-array>

    </resources>

И, наконец, вывод logcat. Первая строка показывает, что вывод строки toString массива не является нулевым.

    D/**IS4447**: [Ljava.lang.String;@c543c7b
    D/AndroidRuntime: Shutting down VM
    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ie.aa.bis.is4447.mylistviewapp, PID: 12011
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ie.aa.bis.is4447.mylistviewapp/ie.aa.bis.is4447.mylistviewapp.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to get length of null array
        at ie.aa.bis.is4447.mylistviewapp.ItemAdapter.getCount(ItemAdapter.java:25)
        at android.widget.ListView.setAdapter(ListView.java:575)
        at ie.aa.bis.is4447.mylistviewapp.MainActivity.onCreate(MainActivity.java:36)

1 Ответ

0 голосов
/ 10 октября 2019

Просто переключите инициализацию переменной со i = items на items = i в вашем конструкторе:

public ItemAdapter(Context c, String[] i) {
        items = i;

        mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

Кроме того, убедитесь, что вы возвращаете View в методе getView() вместо null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...