2

我试图将一些信息从我的片段传递给我的适配器以显示 ListView,它确实通过了,但 ListView 在加载完成后没有显示任何内容。

我确信适配器类有问题。

item是我传递的数据的自定义类)

适配器代码:

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.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MobileArrayAdapter extends ArrayAdapter<List<item>> {
    private final Context context;
    private final List<item> markers;
    private final static String[] a={"s"};


    public MobileArrayAdapter(Context context, List<item> markers) {
        super(context, R.layout.list_item);
        this.context = context;
        this.markers = markers;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.list_item, parent, false);
        TextView title = (TextView) rowView.findViewById(R.id.title);
        ProgressBar loader = (ProgressBar) rowView.findViewById(R.id.loader);
        ImageView image = (ImageView) rowView.findViewById(R.id.itemimgae);
        TextView views = (TextView) rowView.findViewById(R.id.views);
        TextView likes=(TextView) rowView.findViewById(R.id.likes);
        TextView upvote=(TextView) rowView.findViewById(R.id.upvote);
        TextView downvote=(TextView) rowView.findViewById(R.id.downvote);
        TextView desc=(TextView) rowView.findViewById(R.id.desc);
        TextView pub =(TextView) rowView.findViewById(R.id.pub);
        TextView idnum =(TextView) rowView.findViewById(R.id.idnum);

        //Log.e("title",items.get(1).get(0));

        title.setText("      "+markers.get(position).getTitle());
//      views.setText(items.get(6).get(position));
//      likes.setText(items.get(7).get(position));
//      upvote.setText(items.get(8).get(position));
//      downvote.setText(items.get(9).get(position));
//      desc.setText(items.get(4).get(position));
//      pub.setText(items.get(5).get(position));
//      idnum.setText(items.get(0).get(position));


        return rowView;
    }
}

logcat 中没有错误。

这里有什么问题?

4

3 回答 3

2

您必须将数据集传递List<item>给 ArrayAdapter 的超级构造函数或覆盖 getCount 并返回markers.size()

它可能是 super(context, R.layout.list_item, markers);

或者

public class MobileArrayAdapter extends ArrayAdapter<List<item>> {
    private final Context context;
    private final List<item> markers;
    private final static String[] a={"s"};


    public MobileArrayAdapter(Context context, List<item> markers) {
        super(context, R.layout.list_item);
        this.context = context;
        this.markers = markers;
    }


     @Override 
    public int getCount() {
        return (this.markers != null) ? this.markers.size() : 0;
    }

    // the rest of your code
} 

我还可以建议您对该getView方法进行三种优化:

  1. ListView 实现视图回收。每次调用 getView 时,您都必须避免膨胀并返回新视图。
  2. 实现 ViewHolder 模式
  3. 正如@Raghunandan 建议的那样,检索一次对象,然后访问其成员
于 2013-10-12T14:19:11.953 回答
1

像这样做

 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.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MobileArrayAdapter extends ArrayAdapter<List<item>> {
    private final Context context;
    private final List<item> markers;
    private final static String[] a={"s"};


    public MobileArrayAdapter(Context context, List<item> markers) {
        super(context, R.layout.list_item);
        this.context = context;
        this.markers = markers;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.list_item, parent, false);
        TextView title = (TextView) rowView.findViewById(R.id.title);
        ProgressBar loader = (ProgressBar) rowView.findViewById(R.id.loader);
        ImageView image = (ImageView) rowView.findViewById(R.id.itemimgae);
        TextView views = (TextView) rowView.findViewById(R.id.views);
        TextView likes=(TextView) rowView.findViewById(R.id.likes);
        TextView upvote=(TextView) rowView.findViewById(R.id.upvote);
        TextView downvote=(TextView) rowView.findViewById(R.id.downvote);
        TextView desc=(TextView) rowView.findViewById(R.id.desc);
        TextView pub =(TextView) rowView.findViewById(R.id.pub);
        TextView idnum =(TextView) rowView.findViewById(R.id.idnum);

        //Log.e("title",items.get(1).get(0));

        title.setText("      "+markers.get(position).getTitle());
//      views.setText(items.get(6).get(position));
//      likes.setText(items.get(7).get(position));
//      upvote.setText(items.get(8).get(position));
//      downvote.setText(items.get(9).get(position));
//      desc.setText(items.get(4).get(position));
//      pub.setText(items.get(5).get(position));
//      idnum.setText(items.get(0).get(position));


        return rowView;
    }


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



and then in your activity set the adapter as list.adapter();


}
于 2013-10-12T14:22:37.400 回答
0

万一这对其他人有帮助...

我遇到了同样的问题(空白 ListView 项目),在我的情况下,这是由列表行布局的布局宽度规范错误引起的。

不使用:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="1"
    ...

而是使用:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    ...

这只发生在我将父级传递给 LayoutInflater(正如我应该做的那样)时,这使得诊断变得令人沮丧。

于 2015-10-09T13:02:44.713 回答