【问题标题】:getView never called BaseadaptergetView 从未调用过 Baseadapter
【发布时间】:2014-11-25 10:07:25
【问题描述】:

搜索了最常见的类似主题,但没有任何帮助。

public class NewCustomAdapter extends BaseAdapter {

    Context activityContext;
    LayoutInflater myInflater;
    Drawable[] myDrawableArray;
    String[] myLabelArray;
    String[] myABCArray;
    int position = 0;
    ImageView myImg;
    TextView myLabelTextView;
    TextView myABCTextView;

    public NewCustomAdapter(Context context) {

        // TODO Auto-generated constructor stub
        this.activityContext = context;
        myInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {

        // TODO Auto-generated method stub
        Log.e("getcount","true  " + position);
        return position;
    }

    @Override
    public Object getItem(int position) {

        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {

        // TODO Auto-generated method stub
        return position;
    }

    public class Holder {

        ImageView img;
        TextView tv;
        TextView abc;

        public Holder(ImageView img, TextView tv, TextView abc) {

            this.img = img;
            this.tv = tv;
            this.abc = abc;
        }
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        // TODO Auto-generated method stub
        Log.e("getView","true");
        if(convertView == null) {

            convertView = myInflater.inflate(R.layout.customadapter_view_layout_medium, null);
            myImg = (ImageView)     convertView.findViewById(R.id.imageview_layout_normal_portrait_sizemedium);
            myLabelTextView = (TextView) convertView.findViewById(R.id.textview_label_layout_normal_portrait_sizemedium);
            myABCTextView = (TextView) convertView.findViewById(R.id.textview_abc_layout_normal_portrait_sizemedium);
            convertView.setTag(new Holder(myImg,myLabelTextView, myABCTextView));
        } else {

            Holder holder = (Holder) convertView.getTag();
            myImg = holder.img;
            myLabelTextView = holder.tv;
            myABCTextView = holder.abc;
        }
        myImg.setImageDrawable(myDrawableArray[position]);
        myLabelTextView.setText(myLabelArray[position]);
        myABCTextView.setText(myABCArray[position]);

        return convertView;
    }

    public void updateGridView(Drawable[] myDrawableArray_, String[] myLabelArray_, String[] myABCArray_, int position_) {

        this.myDrawableArray = myDrawableArray_;
        this.myLabelArray = myLabelArray_;
        this.myABCArray = myABCArray_;
        this.position = position_;
        this.notifyDataSetChanged();
    }
}

这是一个普通的 BaseAdapter,它从我的 backgroundThread 获取更新。我的 BackgroundThread 调用

updateGridView(...)

方法。方法被按需调用。每次我调用 updateGridView 时都会调用 getCount .. 这样也可以。唯一的问题是。 GridView 不会膨胀。永远不会调用 getView。

在我的 AsyncTask 中,我在 UIThread(onPreExecute()) 上正确设置:

gv = (GridView) myActivityView.findViewById(R.id.gv1);
myCustomAdapter = new NewCustomAdapter(myActivityContext);
gv.setAdapter(myCustomAdapter);

没有错误,只是永远不会调用 getView,这就是为什么 gridview 永远不会被夸大的原因......感谢任何帮助。

【问题讨论】:

  • 您的代码中有很多问题,我认为必须通过基本适配器的正确教程。当这里有任何列表项时调用 getView 没有列表传递给您的 CustomAdapter 的构造函数
  • @DanialHussain 听起来是好是坏。所以我的问题似乎是我传递了一个数组而不是一个列表?这就是为什么他从不调用 getView..
  • myCustomAdapter = new NewCustomAdapter(myActivityContext);有问题
  • 查看给定的链接它们如何覆盖构造函数。 vogella.com/tutorials/AndroidListView/article.html
  • @DanialHussain 我知道这个教程,但他不使用简单的 BaseAdapter,他使用 ArrayAdapter。如果我有多个不同类型的数组,使用 ArrayAdapter 不是更好吗?

标签: android gridview baseadapter


【解决方案1】:

getCount() 返回列表数据的大小并正确实现 ViewHolder 设计模式以提高 ListView 性能:

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

示例:

public class NewCustomAdapter extends BaseAdapter {

    Context context;
    Drawable[] myDrawableArray;
    String[] myLabelArray;
    String[] myABCArray;
    int position;
    public NewCustomAdapter(Context context) {
        this.context = context;
    }

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

    @Override
    public Object getItem(int position) {
        return myDrawableArray[position];
    }

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

    public class Holder {
        ImageView img;
        TextView tv;
        TextView abc;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Holder holder;
        if(convertView == null) {
            holder = new Holder();
            convertView = LayoutInflater.from(context).inflate(R.layout.customadapter_view_layout_medium, null);
            holder.img = (ImageView) convertView.findViewById(R.id.imageview_layout_normal_portrait_sizemedium);
            holder.tv = (TextView) convertView.findViewById(R.id.textview_label_layout_normal_portrait_sizemedium);
            holder.abc = (TextView) convertView.findViewById(R.id.textview_abc_layout_normal_portrait_sizemedium);
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }
        holder.img.setImageDrawable(myDrawableArray[position]);
        holder.tv.setText(myLabelArray[position]);
        holder.abc.setText(myABCArray[position]);

        return convertView;
    }

    public void updateGridView(Drawable[] myDrawableArray_, String[] myLabelArray_, String[] myABCArray_, int position_) {
        this.myDrawableArray = myDrawableArray_;
        this.myLabelArray = myLabelArray_;
        this.myABCArray = myABCArray_;
        this.position = position_;

        this.notifyDataSetChanged();
    }
}

【讨论】:

  • 感谢您的回复。就我而言,这是不可能的。我需要返回位置而不是数组的长度。无论如何,不​​久前我也能够从 Position 开始。无需返回 Array.length。我认为问题是我传递了一个数组而不是一个列表。你也这么认为吗??
  • 感谢您抽出宝贵的时间 Haresh Chhelana。但我不能使用 Array.length,因为由于性能问题,我的 Array 从一开始就固定大小。因此,我的阵列例如 300 个单位大,但我只需要 200 个。其余为空。如果我要设置 Array.length.. 那么我的 GridView 将可缩放到整个数组(其中最后 50 或 100 个“单位”为空)。
  • 那么我的意思是 myLabelArray 或 myABCArray 哪个是相同大小的数组?
  • 都是300“长”。但我只用了大约 200 个。但我的问题是,一开始我不知道我会用多少。这就是为什么我将它们设置为 300 ..
  • 当您知道实际大小时,再次使用确切的数据大小进行初始化。
【解决方案2】:

如果getCount 返回了!= 0,则调用getView

【讨论】:

  • 感谢您的回复。请仔细看看我的 updateGridView 方法。我将位置设置为高于 0 的数字。因此,在我通知具有更高位置的 BaseAdapter 后,getView 将需要被调用......它永远不会保持为 0!就在一开始..换句话说,我也尝试在开始时将位置设置为1,出现同样的问题..所以它与以0开头的位置无关
【解决方案3】:

你需要在getCount方法中返回总数

由于您的第一个位置是 0,因此您的 getCount 方法返回 0,并且适配器认为列表中没有要显示的元素。

【讨论】:

  • 感谢您的回复。请仔细看看我的 updateGridView 方法。我将位置设置为高于 0 的数字。因此,在我通知具有更高位置的 BaseAdapter 后,getView 将需要被调用......它永远不会保持为 0!就在一开始..换句话说,我也尝试在开始时将位置设置为1,出现同样的问题..所以它与以0开头的位置无关
  • 我认为问题在于您正在尝试在后台线程中更新 UI,因为您正在从后台线程调用 updateGridView 方法,尝试在 UIThread 中执行它,也许它会工作
  • 试过了,同样的问题。我认为问题是,我没有传递一个列表而是一个数组。这可能吗?如果是这样,我怎么能设置一个适配器传递我的数组?
  • 这从来都不是问题,你也可以传递一个数组,这没有问题,我认为你应该在互联网上查看一些实现网格视图的参考代码,你很可能忘记了一些基本初始化或类似的东西
  • 你确定?伙计,这个问题让我失望了......在我的问题下面的 cmets 中,Danial Hussain 说我需要传递一个列表而不是一个数组......那么现在是真的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2013-06-12
相关资源
最近更新 更多