Android Listview custom BaseAdapter

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rainmaker1987
  • Registratie: Juni 2005
  • Laatst online: 08-12-2024
Ik ben bezig met een project waarbij ik gegevens uit een externe database in een listview wil neerzetten. De gegevens die in de listview moeten bestaan uit een class: project. Met daarin gegevens als name, id, user etc. Alleen de name wil ik laten weergeven en wanneer een project geselecteerd wordt wil ik weten om welke het gaat zodat in een volgend scherm de details weergegeven kunnen worden.

Nu heb ik een tutorial hiervoor gevolgd (click) daarnaast komt de code overeen met wat ik vanuit een google conferentie/pdf heb kunnen vinden (click) en volgens mij heb ik alles helemaal netjes overgenomen maar ik krijg alsnog de volgende foutmelding:

05-01 11:07:34.751: ERROR/AndroidRuntime(680): java.lang.NullPointerException
05-01 11:07:34.751: ERROR/AndroidRuntime(680): at com.ConsultancyNow.projectBaseAdapter.getView(projectBaseAdapter.java:56)
(lijn 56 komt overeen met 17 in de codeview.

De projects die ik meegeef test ik echter iets eerder of er wat in zit en dan geeft hij netjes bij de vraag projects.get(i).getName() de naam van het project aan. De foutmelding dat er op lijn 56 niets kan worden omgezet begrijp ik dan ook niet.

Het volgende codewerk heb ik:

projectBaseAdapter.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null)
        {
            //MAKE HERE REFERENCES TO THE LISTVIEW ROW LAYOUT
            convertView = mInflater.inflate(R.layout.listview_projects_row, parent, false);
            holder = new ViewHolder();
            holder.projectName = (TextView) convertView.findViewById(R.id.listview_project_row);
        }
        else 
        {
            holder = (ViewHolder) convertView.getTag();
        }
        
        //SET HERE THE VALUES FOR THE VISIBLE VARIABLES
        holder.projectName.setText(projects.get(position).getName());

        return convertView;
    }
    
    //CREATE HERE THE VISIBLE VARIABLES
    static class ViewHolder
    {
        TextView projectName;
    }


viewProjectsMain.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        final ListView varListView;
        varListView = getListView();
        
        varListView.setAdapter(new projectBaseAdapter(this, projects)); 
        Log.d("Rob", "Adapter Set");
        varListView.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
                Object o = varListView.getItemAtPosition(position);
                Project project = (Project) o;
                Intent i = new Intent("com.ConsultancyNow.VIEWPROJECT");
                Log.d("Rob", "Gekozen project: " + project.getName());
                i.putExtra("Project", project.getName()); //even dirty om te testen
                startActivity(i);
            }
        });

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Je hebt ook getest of 'holder.projectName' misschien niet null is? En waarom is ViewHolder static?

[ Voor 20% gewijzigd door eek op 01-05-2011 13:41 ]

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • Rainmaker1987
  • Registratie: Juni 2005
  • Laatst online: 08-12-2024
Viewholder is static omdat de velden die in de row van de listview komen niet wijzigen zie ook page 15/16 van http://dl.google.com/goog...d-of-listview-android.pdf + de bijbehorende video. Wat betreft holder.projectName heb ik de volgende xml die de listview zou moeten vullen die overeenkomt met line 9 van projectBaseAdapter.java:

listview_projects_row.xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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">
    
    <TextView
        android:id="@+id/listview_project_row"
        style="android:attr/listItemFirstLineStyle"
        android:textColor="#C2C2C2"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:paddingTop="2sp" 
        android:paddingBottom="2sp">
    </TextView>
    
</LinearLayout>

Acties:
  • 0 Henk 'm!

  • Rainmaker1987
  • Registratie: Juni 2005
  • Laatst online: 08-12-2024
Feest, eindelijk opgelost:

eek heeft grotendeels gelijk gehad. Helaas moest ik niet specifiek kijken naar holder.projectName maar naar holder zelf. De volgende stuk code moest nog worden toegevoegd:

convertView.setTag(holder);

Even voor de volledigheid de hele code van projectBaseAdapter.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.Programma;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class projectBaseAdapter extends BaseAdapter {
    
    //SET THIS TO THE ARRAYLIST USED
    private static ArrayList<Project> projects; 
    
    private LayoutInflater mInflater;
    
    public projectBaseAdapter(Context context, ArrayList<Project> data)
    {
        projects = data;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return projects.size();
    }

    @Override
    public Object getItem(int position) {
        return projects.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if(convertView == null)
        {
            //MAKE HERE REFERENCES TO THE LISTVIEW ROW LAYOUT
            convertView = mInflater.inflate(R.layout.listview_projects_row, parent, false);
            holder = new ViewHolder();
            holder.projectName = (TextView) convertView.findViewById(R.id.listview_project_row);
            
            convertView.setTag(holder);
        }
        else 
        {
            holder = (ViewHolder) convertView.getTag();
        }
                
        //SET HERE THE VALUES FOR THE VISIBLE VARIABLES
        holder.projectName.setText(projects.get(position).getName());

        return convertView;
    }
    
    //CREATE HERE THE VISIBLE VARIABLES
    static class ViewHolder
    {
        TextView projectName;
    }
}

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Volgende keer even de linenumbers erbij zetten met commetns, nu moesten we gokken wat regel 56 was :)