set adapter上的null对象引用

时间:2018-06-06 18:08:19

标签: java android android-fragments android-viewpager

我知道有很多这样的问题,但我找不到可以帮助我的问题。请不要注意硬编码的字符串或其他类似的东西,我会修复。我没有在适配器类或片段中看到任何错误。我使用Disco类填充地方列表,Place类包含我在适配器中使用后的所有方法。任何人都可以帮助我吗?谢谢。

Class MainActivity

new

班迪斯科

package com.techmind.tourguideapp;

import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

    FragmentManager manager = getSupportFragmentManager();
    ViewPager pager = findViewById(R.id.tourPager);
    pager.setAdapter(new FragmentAdapter(manager));

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(pager);
}
}

Class DiscoFragment

package com.techmind.tourguideapp;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Nahuel on 31.05.2018.
 */

public class Disco {

public static ArrayList<Places> initDiscoList(ArrayList<Places> places) {
    places.add(new Places().
            setAddress("via a").
            setImage(1).
            setName("casino").
            setPhone("333").
            setPrice("20€").
            setHour("10:30"));

    return places;
}
}

Class FragmentAdapter

package com.techmind.tourguideapp;

import android.support.v4.app.Fragment;
import android.location.Location;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Nahuel on 31.05.2018.
 */

public class DiscoFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {

    ArrayList<Places> list = new ArrayList<>();
    list = Disco.initDiscoList(list);
    PlacesAdapter adapter = new PlacesAdapter(getActivity(), list);
    View view = inflater.inflate(R.layout.row_item, container, false);
    ListView listView = (ListView) view.findViewById(R.id.list_items);
    listView.setAdapter(adapter);

    return view;
}
}

课程地点

package com.techmind.tourguideapp;

import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

/**
 * Created by Nahuel on 31.05.2018.
 */

public class FragmentAdapter extends FragmentPagerAdapter {


public FragmentAdapter (FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return new DiscoFragment();
}

@Override
public int getCount() {
    return 3;
}

public CharSequence getPageTitle(int position) {
    return "Gradara";
}
}

Class PlaceAdapter

package com.techmind.tourguideapp;

/**
 * Created by Nahuel on 31.05.2018.
 */

public class Places {

private String name;
private String price;
private String phone;
private String Address;
private String hour;
private int image;
private final int NO_IMAGE = -1;

public Places () {
}

public String getHour() {
    return hour;
}

public String getName() {
    return name;
}

public String getPrice() {
    return price;
}

public String getPhone() {
    return phone;
}

public String getAddress() {
    return Address;
}

public int getImage() {
    return image;
}

public Places setName(String name) {
    this.name = name;
    return this;
}

public Places setHour(String hour) {
    this.hour = hour;
    return this;
}

public Places setPrice(String price) {
    this.price = price;
    return this;
}

public Places setPhone(String phone) {
    this.phone = phone;
    return this;
}

public Places setAddress(String address) {
    Address = address;
    return this;
}

public Places setImage(int image) {
    this.image = image;
    return this;
}
}

activity_main.xml中

package com.techmind.tourguideapp;

import android.content.Context;
import android.location.Location;
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.List;


public class PlacesAdapter extends ArrayAdapter<Places> {

public PlacesAdapter(Context context,  List<Places> places) {
    super(context,-1, places);
}

public View getView (int position, ViewGroup parent, View convertView) {

    View listView = convertView;
    Places place = getItem(position);

    if(listView == null) {
        listView = LayoutInflater.from(getContext()).inflate(
                R.layout.row_item, parent, false);
    }


    TextView location = listView.findViewById(R.id.locationName);
    location.setText("casino");
    TextView hour = listView.findViewById(R.id.txthour);
    hour.setText("aaa");
    TextView address = listView.findViewById(R.id.address);
    address.setText("aaaaa");
    TextView price = listView.findViewById(R.id.txtmoney);
    price.setText("aaaaa");
    TextView phone = listView.findViewById(R.id.phone);
    phone.setText("aaaaa");
    ImageView img = listView.findViewById(R.id.imgRow);
    img.setImageResource(R.drawable.ic_launcher_background);

    return listView;
}
}

List_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.techmind.tourguideapp.MainActivity">

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMaxWidth="0dp"
    />

<android.support.v4.view.ViewPager
    android:id="@+id/tourPager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

Row_item.xml

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ListView
    android:id="@+id/list_items"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

</ListView>

</LinearLayout>

2 个答案:

答案 0 :(得分:0)

你说你在set adapter上有一个空指针。你在说什么吗? 这行文件DiscoFragment?

listView.setAdapter(适配器)

如果listView为null,则findViewByID找不到视图。或者也许适配器内的东西是null。你说的很难说清楚。

答案 1 :(得分:0)

我在

中发现错误
ArrayList<Places> list = new ArrayList<>();
list = Disco.initDiscoList(list);
PlacesAdapter adapter = new PlacesAdapter(getActivity(), list);
View view = inflater.inflate(R.layout.row_item, container, false);
ListView listView = (ListView) view.findViewById(R.id.list_items);
listView.setAdapter(adapter);

return view;
}

当我使用inflate方法时,第一个参数错误,我使用了行的布局而不是listView布局。

感谢您的回答,下次我会发布日志和更少无用的代码:)