列表视图适配器不工作,未调用getView。

时间:2012-08-20 13:31:36

标签: java android android-listview android-arrayadapter

我想我变得疯了。如此简单的东西将自定义适配器绑定到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”。

怎么了?

4 个答案:

答案 0 :(得分: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 Tutorial on List View & List Activity,尝试在列表适配器中使用 ViewHolder ,这将提高您的观看效果。

答案 1 :(得分:10)

这是因为您保留了getCount()方法的默认实现,该方法返回0,因此适配器认为ListView中没有要显示的元素。

它应该返回mData.length

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

答案 2 :(得分:3)

您尚未实施getCount()getItemId(...)

如果您不打算为它们进行自定义实施,您可以取出这些方法并使用默认值。

暂时取出它们然后尝试。

答案 3 :(得分:2)

这样做的正确方法是致电super(context, textViewResourceId, values) - 你已经在做了。在这种情况下,您可以完全删除getCount()getItemId(...)功能。您的List来自的类将自动返回正确的值。

  • 干杯