2016-07-25 22 views
0

Guten Tag, Ich habe ein Problem mit meinem benutzerdefinierten Adapter nicht meine Listenansichten bevölkern. Ich bekomme diese Fehlermeldung:ListView wird nicht mit Daten gefüllt

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 
                       at com.bestworkouts.sheikoworkout.MyWorkout$1.onChildClick(MyWorkout.java:64) 

machen mich denken, meine Arraylist leer ist .. das ist, wo ich den Adapter nennen:

ArrayList<CustomObject> w29 = new ArrayList<CustomObject>(); 
    w29.add(new CustomObject("Squat", "65%", "6", "150", false)); 

    final CustomListViewAdapter customListViewAdapter = new CustomListViewAdapter(this, w29); 


    expandableListView = (ExpandableListView) findViewById(R.id.listViewWorkouts); 
    Workouts_details = DataProvider.getInfo(); 
    Workout_list = new ArrayList<>(Workouts_details.keySet()); 
    mAdapter = new WorkoutsAdapter(this, Workouts_details, Workout_list); 

    final ListView listViewFri = (ListView) findViewById(R.id.listViewFri); 
    final ListView listViewMon = (ListView) findViewById(R.id.listViewMon); 
    final ListView listViewWed = (ListView) findViewById(R.id.listViewWed); 

    expandableListView.setAdapter(mAdapter); 

    expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
      if (groupPosition == 0) { 
       if (childPosition == 0) { 
        listViewMon.setAdapter(customListViewAdapter); 
        listViewFri.setAdapter(customListViewAdapter); 
        listViewWed.setAdapter(customListViewAdapter); 
        Intent intent = new Intent(getApplicationContext(), WorkoutDaysActivity.class); 
        startActivity(intent); 

Dies ist der Adapter:

public class CustomListViewAdapter extends BaseAdapter { 

private LayoutInflater inflater; 
public ArrayList<CustomObject> objects; 
boolean[] checkBoxState; 
CustomObject data[] = null; 




private class ViewHolder { 
    TextView txtExercise; 
    TextView txtPercent; 
    TextView txtReps; 
    TextView txtWeight; 
    CheckBox check1; 
} 

public void addAdapterItem(CustomObject item) { 
    objects.add(item); 
} 

public CustomListViewAdapter(Context context, ArrayList<CustomObject> objects) { 
    inflater = LayoutInflater.from(context); 
    this.objects = objects; 
    checkBoxState= new boolean[objects.size()]; 
} 

public int getCount() { 
    return objects.size(); 
} 

public CustomObject getItem(int position) { 
    return objects.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    if(convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.workout_item, null); 
     holder.txtExercise = (TextView) convertView.findViewById(R.id.txtExercise); 
     holder.txtPercent = (TextView) convertView.findViewById(R.id.txtPercentage); 
     holder.txtReps = (TextView) convertView.findViewById(R.id.txtReps); 
     holder.txtWeight = (TextView) convertView.findViewById(R.id.txtWeight); 
     holder.check1 = (CheckBox) convertView.findViewById(R.id.check1); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.txtExercise.setText(objects.get(position).getExercise()); 
    holder.txtPercent.setText(objects.get(position).getPercent()); 
    holder.txtReps.setText(objects.get(position).getReps()); 
    holder.txtWeight.setText(objects.get(position).getWeight()); 
    holder.check1.setChecked(checkBoxState[position]); 

    holder.check1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(((CheckBox)v).isChecked()) { 
       checkBoxState[position] = true; 
      } else { 
       checkBoxState[position] = false; 
      } 
     } 
    }); 


    return convertView; 
} 
} 

dies die benutzerdefinierte Objektklasse:

public class CustomObject { 

private String exercise; 
private String percent; 
private String reps; 
private String weight; 
private boolean check1; 

public CustomObject(String exercise, String percent, String reps, String weight, boolean check1) { 
    this.exercise = exercise; 
    this.percent = percent; 
    this.reps = reps; 
    this.weight = weight; 
    this.check1 = check1; 
} 

public String getExercise() { 
    return exercise; 
} 

public String getPercent() { 
    return percent; 
} 

public String getReps() { 
    return reps; 
} 

public String getWeight() { 
    return weight; 
} 

// public CheckBox getCheck1() { 
//  return check1; 
// } 
} 

Dies ist Teil der WorkoutDaysActivity (Wo die Absicht gesendet wird) (Ich habe die Methode on create sowie die 3 Registerkarten mit eingerichtet.

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


    mToolBar = activateToolbarWithHomeEnabled(); 
    setUpNavigationDrawer(); 
//  setSupportActionBar(toolbar); 
//  getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

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


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


     switch (getArguments().getInt(ARG_SECTION_NUMBER)) { 
      case 1: 
       View rootView = inflater.inflate(R.layout.fragment_workout_days, container, false); 
//     CustomListViewAdapter mCustomListViewAdapter; 
//     mCustomListViewAdapter = new CustomListViewAdapter(this,) 
//     ListView listViewMon = (ListView) rootView.findViewById(R.id.listViewMon); 
//     listViewMon.setAdapter(mCustomListViewAdapter); 


       return rootView; 
      case 2: View rootView2 = inflater.inflate(R.layout.fragment_sub_page1, container, false); 
       TextView textView2 = (TextView) rootView2.findViewById(R.id.textView2); 
       textView2.setText("Workout 29 Week 1"); 
       return rootView2; 
      case 3: 
       View rootView3 = inflater.inflate(R.layout.fragment_sub_page2, container, false); 
       TextView textView3 = (TextView) rootView3.findViewById(R.id.txtFrag3); 
       textView3.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); 
       return rootView3; 
      default: View rootView4 = inflater.inflate(R.layout.fragment_workout_days, container, false); 
       TextView textView4 = (TextView) rootView4.findViewById(R.id.txtFrag1); 
       textView4.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); 
       return rootView4; 
     } 
// 
    } 
} 

Vielen Dank für Ihre Hilfe!

Antwort

0

Fehler klar ist, von Listview-Objekte ist null:

final ListView listViewFri = (ListView) findViewById(R.id.listViewFri); 
final ListView listViewMon = (ListView) findViewById(R.id.listViewMon); 
final ListView listViewWed = (ListView) findViewById(R.id.listViewWed); 

Prüfung tut Ansichten ids korrekt sind

+0

Danke für die Antwort, unter, wo ich den Adapter eingestellt habe, habe ich eine Absicht, die die App an eine neue Klasse sendet, wenn Kind Element geklickt. In dieser Klasse habe ich den Inhalt auf ein anderes Layout gesetzt. Ich denke, hier könnte das Problem liegen. Die Listenansichten sind in keinem dieser Layouts vorhanden, sie befinden sich tatsächlich in den Tabfragmenten, an die der Childclick gesendet wird. Ich bin mir nicht sicher, wie ich das beheben kann. Ich werde in der Frage diese Aktivität hinzufügen. – LBJ33

+0

Ich habe die Intent-Zeile hinzugefügt, in der Im versucht, den Adapter festzulegen, ich habe auch die Klasse hinzugefügt, an die die App gesendet wird, und wo die Registerkarten eingerichtet sind. Danke für die Hilfe – LBJ33

0

Es sagt, dass die Listviews null sind, können Sie Ihre xml überprüfen, um sicherzustellen, dass Sie die Listenansichten korrekt hinzufügen. Kannst du auch deinen Code der Aktivität onCreate deiner Aktivität einfügen oder wo du die xml aufblasen oder setContentView tun. Sie legen die Ansicht nicht richtig fest. Ihre Arraylists sind in Ordnung und Ihr Adapter-Code scheint auch in Ordnung zu sein

+0

Danke für die Antwort, unter, wo ich den Adapter eingestellt habe, habe ich eine Absicht, die die App an eine neue Klasse sendet, wenn Kind Element geklickt. In dieser Klasse habe ich den Inhalt auf ein anderes Layout gesetzt. Ich denke, hier könnte das Problem liegen. Die Listenansichten sind in keinem dieser Layouts vorhanden, sie befinden sich tatsächlich in den Tabfragmenten, an die der Childclick gesendet wird. Ich bin mir nicht sicher, wie ich das beheben kann. Ich werde in der Frage diese Aktivität hinzufügen. – LBJ33

+0

Ich habe die Intent-Zeile hinzugefügt, in der ich versuche, den Adapter zu setzen, ich habe auch die Klasse hinzugefügt, an die die App gesendet wird, und wo die Registerkarten eingerichtet sind. Vielen Dank für Ihre Hilfe. – LBJ33

+0

Ich frage mich, ob ich vielleicht den ganzen Code im switch-Argument machen sollte, wo die Tabs eingerichtet sind. Das einzige Problem ist dann, wie ich weiß, auf welches Element in der vorherigen erweiterbaren Listenansicht geklickt wurde, da jedes einzelne unterschiedliche Daten liefert. – LBJ33

0

Fehler ist ziemlich einfach. Beim Lesen der Referenz von listView machen Sie einen Fehler beim Schreiben der ID. z.B. R.id.list (Liste ist die ID hier)

Vielleicht verwenden Sie eine andere Referenz, die nicht in der .xml Ihres Layouts gefunden wird, die Sie für diese Aktivität verwenden.