基于类的自定义布局listview的Android适配器

基于类的自定义布局listview的Android适配器,android,adapter,Android,Adapter,我有一个类似这样的类: public class Vizita { public int icon; public String titlu; public String loc; public String idviz; public Vizita(){ super(); } public Vizita(int icon, String titlu, String

我有一个类似这样的类:

public class Vizita {
     public int icon;
        public String titlu;
        public String loc;
        public String idviz;
        public Vizita(){
            super();
        }

        public Vizita(int icon, String titlu, String loc, String idviz) {
            super();
            this.icon = icon;
            this.titlu = titlu;
            this.loc = loc;
            this.idviz = idviz;
        }
}
public class MyActivity extends Activity {
{...}
JSONArray lststat;
{...}
public JSONArray liststatus() {
    JSONArray jdata=post.getserverdataX(url_connectX);
    return jdata;
}   

class asyncpost extends AsyncTask< String, String, String > {
Vizita weather_data[];
....
protected void onPostExecute(String result) {
VizitaAdapter adapter = new VizitaAdapter(MyActivity.this,R.layout.listview_item_row, weather_data);
myListView.setAdapter(adapter);   
...}
lststat = liststatus();
JSONObject json_data; 
try {
     int length = lststat.length();
     Vizita weather_data[] = new Vizita[length];
     for (int i = 0; i < length; i++)
     {
        json_data = lststat.getJSONObject(i);
        weather_data[i].titlu =json_data.getString("clientnume");
        weather_data[i].idviz =json_data.getString("idvizite");
        weather_data[i].loc =json_data.getString("localitate");
     }
} catch (Exception e) {
Log.e(null, e.toString());
}            
我使用AsyncTask从PHP中检索JSON数组。所有工作都非常适合listview的简单布局。但我想使用更复杂的布局,所以我设计了一个使用上述Vizita.class中所有4个值的布局。但我不知道如何为它设置适配器,因为我尝试它的方式会给我带来错误

当然,我尝试在onPostExecute中执行,如下所示:

public class Vizita {
     public int icon;
        public String titlu;
        public String loc;
        public String idviz;
        public Vizita(){
            super();
        }

        public Vizita(int icon, String titlu, String loc, String idviz) {
            super();
            this.icon = icon;
            this.titlu = titlu;
            this.loc = loc;
            this.idviz = idviz;
        }
}
public class MyActivity extends Activity {
{...}
JSONArray lststat;
{...}
public JSONArray liststatus() {
    JSONArray jdata=post.getserverdataX(url_connectX);
    return jdata;
}   

class asyncpost extends AsyncTask< String, String, String > {
Vizita weather_data[];
....
protected void onPostExecute(String result) {
VizitaAdapter adapter = new VizitaAdapter(MyActivity.this,R.layout.listview_item_row, weather_data);
myListView.setAdapter(adapter);   
...}
lststat = liststatus();
JSONObject json_data; 
try {
     int length = lststat.length();
     Vizita weather_data[] = new Vizita[length];
     for (int i = 0; i < length; i++)
     {
        json_data = lststat.getJSONObject(i);
        weather_data[i].titlu =json_data.getString("clientnume");
        weather_data[i].idviz =json_data.getString("idvizite");
        weather_data[i].loc =json_data.getString("localitate");
     }
} catch (Exception e) {
Log.e(null, e.toString());
}            
公共类MyActivity扩展活动{
{...}
JSONArray lststat;
{...}
公共JSONArray列表状态(){
JSONArray jdata=post.getserverdataX(url\u connectX);
返回jdata;
}   
类asyncpost扩展了AsyncTask{
维齐塔气象数据[];
....
受保护的void onPostExecute(字符串结果){
VizitaAdapter=新的VizitaAdapter(MyActivity.this,R.layout.listview\u item\u row,weather\u data);
myListView.setAdapter(适配器);
...}
在doInBackground中,我处理JSON的方式如下:

public class Vizita {
     public int icon;
        public String titlu;
        public String loc;
        public String idviz;
        public Vizita(){
            super();
        }

        public Vizita(int icon, String titlu, String loc, String idviz) {
            super();
            this.icon = icon;
            this.titlu = titlu;
            this.loc = loc;
            this.idviz = idviz;
        }
}
public class MyActivity extends Activity {
{...}
JSONArray lststat;
{...}
public JSONArray liststatus() {
    JSONArray jdata=post.getserverdataX(url_connectX);
    return jdata;
}   

class asyncpost extends AsyncTask< String, String, String > {
Vizita weather_data[];
....
protected void onPostExecute(String result) {
VizitaAdapter adapter = new VizitaAdapter(MyActivity.this,R.layout.listview_item_row, weather_data);
myListView.setAdapter(adapter);   
...}
lststat = liststatus();
JSONObject json_data; 
try {
     int length = lststat.length();
     Vizita weather_data[] = new Vizita[length];
     for (int i = 0; i < length; i++)
     {
        json_data = lststat.getJSONObject(i);
        weather_data[i].titlu =json_data.getString("clientnume");
        weather_data[i].idviz =json_data.getString("idvizite");
        weather_data[i].loc =json_data.getString("localitate");
     }
} catch (Exception e) {
Log.e(null, e.toString());
}            
lststat=liststatus();
JSONObject json_数据;
试一试{
int length=lststat.length();
维齐塔气象数据[]=新维齐塔[长度];
for(int i=0;i
其中liststatus()是调用asyncTask以检索所需JSONArray的位置

但是我在for循环中收到一个java.lang.NullPointerException(如果我对setAdapter行进行注释)

我想我没有正确初始化weather_数据数组?!?!? 如果我(取消注释)在onPostExecute中设置适配器,我将收到一个崩溃错误“强制关闭” 我在IDE中没有收到任何错误,似乎语法很好

请告诉我我做错了什么?我怎样才能修复它

VizitaAdapter的代码如下所示

public class VizitaAdapter extends ArrayAdapter<Vizita>{

    Context context;
    int layoutResourceId;   
    Vizita data[] = null;

    public VizitaAdapter(Context context, int layoutResourceId, Vizita[] 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;
        WeatherHolder holder = null;

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

            holder = new WeatherHolder();
            holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
            holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
            holder.txtLoco = (TextView)row.findViewById(R.id.txtLocalitate);
            holder.txtIdviz = (TextView)row.findViewById(R.id.txtIdVizite);

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

        Vizita weather = data[position];
        holder.txtTitle.setText(weather.titlu);
        holder.txtLoco.setText(weather.loc);
        holder.txtIdviz.setText(weather.idviz);
        holder.imgIcon.setImageResource(weather.icon);

        return row;
    }

    static class WeatherHolder
    {
        ImageView imgIcon;
        TextView txtTitle;
        TextView txtLoco;
        TextView txtIdviz;
    }    
}   
公共类VizitaAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
Vizita数据[]=null;
公共VizitaAdapter(上下文上下文、int-layoutResourceId、Vizita[]数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
WeatherHolder=null;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
支架=新的密封支架();
holder.imgIcon=(ImageView)row.findViewById(R.id.imgIcon);
holder.txtTitle=(TextView)row.findViewById(R.id.txtTitle);
holder.txtLoco=(TextView)row.findViewById(R.id.txtLocalite);
holder.txtIdviz=(TextView)row.findViewById(R.id.txtIdVizite);
row.setTag(支架);
}
其他的
{
holder=(WeatherHolder)row.getTag();
}
维齐塔天气=数据[位置];
holder.txtitle.setText(weather.titlu);
支架.txtLoco.setText(天气位置);
holder.txtIdviz.setText(weather.idviz);
holder.imgIcon.setImageResource(weather.icon);
返回行;
}
静态类风挡
{
ImageView imgIcon;
TextView-txtTitle;
TextView-txtLoco;
TextView-txtIdviz;
}    
}   

可能您忘记了初始化
Vizita
循环中的对象:

json_data = lststat.getJSONObject(i);
weather_data[i] = new Vizita();
weather_data[i].titlu =json_data.getString("clientnume");
weather_data[i].idviz =json_data.getString("idvizite");
weather_data[i].loc =json_data.getString("localitate");

很好的回答。你是对的。但是我的listview仍然是空的。我在设置适配器之前做了一个日志。e,weather_数据确实是空的。还有什么问题?可能是
VizitaAdapter
有问题。发布代码或检查方法
getCount
返回正值。我将在2分钟后发布适配器的代码。请不要不要走开。只需复制/粘贴。我已添加完代码。它在问题正文中。谢谢。我在任何地方都没有看到任何getCount。请检查我的代码以获取上面的适配器,在问题正文中对不起,我的错误。适配器很好。检查此项:
weather\u data[]=new Vizita[length];
(在begging中首先删除
Vizita
,所以不应该引入locale变量,而应该初始化类字段)