列表视图适配器无法正常工作,getView方法未被调用。

8
我认为我快疯了。将自定义适配器绑定到Listview这样的简单事情居然让我头痛不已。
请发布代码并解释:
MainActivity.java
package com.example.pruebalist;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    private static String[] data = new String[] {"0","1","2","3"};

    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Log.v("MainActivity","Inside MainActivity");
        setContentView(R.layout.main);
        ListView lstView = (ListView)findViewById(R.id.listNoticias);

        ArrayAdapter<String> adapter = new LstAdapter(this, R.layout.row, data);
        lstView.setAdapter(adapter);
    }

}

LstAdapter.java

package com.example.pruebalist;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class LstAdapter extends ArrayAdapter<String>{

    private String[] mData;
    private Context mContext;
    int layoutResourceId;

    public LstAdapter(Context context, int textViewResourceId, String[] values) {
        super(context, textViewResourceId, values);
        mContext = context;
        mData = values;
        layoutResourceId = textViewResourceId;

        Log.v("LstAdapter","Inside LstAdapter");
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View v = convertView;
        Log.v("LstAdapter","Inside getView");

        if(v==null){
            LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
            v = inflater.inflate(layoutResourceId, parent,false);
        }

        String item = mData[position];
        if(item!=null){
            TextView txtItem = (TextView)v.findViewById(R.id.texto);
            if(txtItem!=null){
                txtItem.setText(item);
            }
        }

        return v;
    }

}

ListView从未显示。并且getView从未被使用,logCat没有显示“Inside Getview”。
有什么问题?

1
你能发布你的布局文件吗? - RvdK
4个回答

28

主要问题是

@Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

将其更改为

@Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mData.length;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return mData[arg0];
    }

看看这个Vogella关于列表视图和列表活动的教程,尝试在列表适配器中使用ViewHolder它可以提高您的视图性能。


哦,谢谢!但我觉得我要跳窗了。 - Rafael Osuna Dominguez
2
我简直不敢相信,我已经使用了这个自定义列表视图适配器的确切方法约50次,并且遇到了这个问题,让我浪费了4个小时的生命。 - dell116
在将我的数组适配器从使用String[]更改为使用自定义对象后,我遇到了这个问题。虽然我理解需要实现这些方法的必要性,但由于之前没有这样做过,所以在重构时从未想到过。文档提到了重写toString()和getView()方法,然而,它也应该提到getCount()方法,因为不这样做会导致无法显示任何内容。 - farnett
我也遇到了这个问题,你真的帮了我大忙 :) - Ralphilius

10
这是因为你没有修改默认的getCount() 方法实现,它返回0,所以Adapter认为在ListView中没有要显示的元素。

应该返回mData.length

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

3

你尚未实现 getCount()getItemId(...) 方法。

如果你不计划对它们进行自定义实现,可以直接删除这些方法并使用默认值。

暂时将它们取出并尝试。


2

正确的做法是调用super(context, textViewResourceId, values)-你已经在这样做了。在这种情况下,你可以完全删除getCount()getItemId(...)函数。你的列表所继承的类会自动返回正确的值。

  • 干杯

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接