【问题标题】:Android - ListView items wont display object dataAndroid - ListView 项目不会显示对象数据
【发布时间】:2012-06-21 22:08:13
【问题描述】:

我正在使用 BaseAdapter 并向其传递具有自己数据集的对象列表。在列表视图的每一行中,ID 都像图像、描述等。每个对象的。当我按照我现在设置的方式使用 BaseAdapter 时,我没有收到任何错误,并且我在调试器和 logcat 中反复检查我的对象列表有效且不为空。但由于某种原因,该列表使用正确数量的对象构建,但不是 ImageViews、TextViews 或其他任何东西之一接受任何数据。每行中唯一的东西是我在列表行的 xml 布局中使用的相同默认数据。就像对每个视图的 set 方法的调用要么由于某种原因被忽略,要么视图的内容被传递到屏幕上的另一个上下文或一些古怪的东西。无论如何,这是我的 BaseAdapter 类:

 class MaItemAdapter extends BaseAdapter{
        List<Ma> mas = null;
        Context cntx = null;
        //LayoutInflater myInflater;
        int itemPosition =0;
        ViewHolder holder;

        public MarkItemAdapter(Activity cntx,List<Ma> mas){
            super();
            this.mas = mas;
            this.cntx = cntx;
            //myInflater = LayoutInflater.from(cntx);

        }

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

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return mas.get(position);
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            itemPosition = position;
            RelativeLayout rl = null;
            Mark ma = mas.get(itemPosition);
            if (convertView==null) {
                rl = (RelativeLayout) LayoutInflater.from(cntx).inflate(
                        R.layout.ma_row_item, parent, false);
                holder = new ViewHolder();
                try{
                holder.description = (TextView) rl.findViewById(R.id.ma_description);
                holder.distance = (TextView) rl.findViewById(R.id.ma_distance);
                holder.ma_image = (ImageView) rl.findViewById(R.id.ma_image);
                holder.view_ma = (ImageButton) rl.findViewById(R.id.view_ma);
                holder.rate_ma = (RatingBar) rl.findViewById(R.id.rate_ma);
                holder.description.setText(ma.title);
                holder.distance.setText(ma.getDistanceString());
                holder.view_ma.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View arg0) {
                    //dostuff
                }

            });
            if(ma.textImg!=null &&
                    !ma.textImg.isRecycled()){
            holder.ma_image.setImageBitmap(ma.textImg);
            }else{
                holder.ma_image.setImageResource(R.raw.skyma);
            }}catch(NullPointerException e){}
            }else{
                rl = (RelativeLayout) convertView;
            }


        //add logic for rating bar

            return rl;
        }


    }

//convenience class to create views 
    private class ViewHolder{
        ImageView ma_image;
        TextView description;
        TextView distance;
        ImageButton view_ma;
        RatingBar rate_ma;

        public ViewHolder(){
            ma_image = new ImageView(getApplicationContext());
            description = new TextView(getApplicationContext());
            distance = new TextView(getApplicationContext());
            view_ma = new ImageButton(getApplicationContext());
            rate_ma = new RatingBar(getApplicationContext());
        }
    }

}

我浏览了一些教程,它们运行良好,但是当我在自己的应用程序中使用此设置时,它就不行了。在正确方向上的一些帮助会很棒。我应该提到的另一件事是,如果我按下评分栏,我会看到每四五行弹出相同的评分。 任何帮助将不胜感激。

【问题讨论】:

  • 你确定你的 try-catch 块中没有 NPE 吗?如果是这样,您只需忽略它。此外,如果 convertView 不为空(除了将其转换为 RelativeLayout),您似乎也不会对它进行任何操作(除了将其转换为 RelativeLayout),您需要在每次调用 getView 方法时设置图像和文本视图的内容
  • 是的,当我尝试从对象中设置文本时,我偶尔会得到一个 NPE,当我在调试器中查看它时它不是空的,所以我现在只是将它用作创可贴
  • 你去吧,一旦你在 holder.description.setText(ma.title) 获得 NPE,你的 convertView 将不会在下次调用适配器 getView 时为空,并且你永远不会设置所有值再次。顺便说一句:你真的需要初始化 ViewHolder 中的视图吗?您通过 findViewById() 设置它们 - 也许您应该将整个代码移动到您的 ViewHolder 构造函数
  • 也就是说,将所有 findViewById() 调用移动到我的 ViewHolder 构造函数中?我不必这样做,但在调试器中,即使没有 NPE,我也会看到 TextView 出现空值。我会将这些字段的初始化移到构造函数中,看看会发生什么,并在几分钟后发回。
  • 好吧,我删除了我的 try catch 并移动了 findViewById 调用,但是当我在 ConvertView==null 时第一次 setText 时,我仍然得到 NPE。

标签: android android-listview baseadapter


【解决方案1】:

在您的 getView 方法中尝试此操作...这就是我的自定义适配器的设置方式。

itemPosition = position;
View v = convertView;
Mark ma = mas.get(itemPosition);

if (v == null) {
    LayoutInflater inflater = (LayoutInflater) cntx
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.ma_row_item, null);
    holder = new ViewHolder();
}

holder.description = (TextView) v.findViewById(R.id.ma_description);
holder.distance = (TextView) v.findViewById(R.id.ma_distance);
holder.ma_image = (ImageView) v.findViewById(R.id.ma_image);
holder.view_ma = (ImageButton) v.findViewById(R.id.view_ma);
holder.rate_ma = (RatingBar) v.findViewById(R.id.rate_ma);
holder.description.setText(ma.title);
holder.distance.setText(ma.getDistanceString());
holder.view_ma.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View arg0) {
        //dostuff
    }

});

if(ma.textImg!=null && !ma.textImg.isRecycled()) {
    holder.ma_image.setImageBitmap(ma.textImg);
} else {
    holder.ma_image.setImageResource(R.raw.skyma);
}

如果这不起作用,我还建议您从 getView 方法主体中而不是在 ViewHolder 中初始化您的各个视图。比如:

TextView description = (TextView) v.findViewById(R.id.ma_description);
description.setText(ma.title);

【讨论】:

  • 不,那也没用。我仍然得到与以前相同的空指针。由于某种原因,它只是忽略了 getview 中任何视图的实例化
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多