Android:JSONArray&;JSONObject到ListView奇怪的读数

Android:JSONArray&;JSONObject到ListView奇怪的读数,android,listview,arrays,Android,Listview,Arrays,已尝试使用以下命令: ListView savedArtList = (ListView) sav.findViewById(R.id.savelist); ArticleAdapter savedadapter = new ArticleAdapter(cont, flip); ArtList.setAdapter(savedadapter); 创建使用包含Json对象的JsonArray的listview。由于某种原因,这个 '公共视图getView(int位置,视图转换视图,视图组父视

已尝试使用以下命令:

ListView savedArtList = (ListView) sav.findViewById(R.id.savelist);
ArticleAdapter savedadapter = new ArticleAdapter(cont, flip);
ArtList.setAdapter(savedadapter);

创建使用包含Json对象的JsonArray的listview。由于某种原因,这个 '公共视图getView(int位置,视图转换视图,视图组父视图)' 代码被激发的次数超过了jsonarray中的内容

我做了一个控制测试来检查这一点,我发现即使在jsonarray中只有一个Jsonobject,我也会激活32次getView代码

我很困惑为什么会发生这种情况,因为我的朋友们已经成功地编写了与我类似的代码,但是没有我所遭受的大量激活。我是不是太慢了,这是因为单个Jsonobject中不仅有图像和文本,还有大约15个其他项目?还是有其他原因

我将非常感谢您对此提供的任何帮助,我将在下面发布适配器代码:

    public class ArticleAdapter extends BaseAdapter{

    private JSONArray items;
    private Context cont;
    public ArticleAdapter(Context context, JSONArray array)
    {
        super();
        this.items = array;
        this.cont = context;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    }@Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View v = convertView;
        WebIView sath;
        TextView sati;
        Log.i("Seiji", "Checking! " + position);
        try
        {       
            if(!items.isNull(position))
            {
                JSONObject item = items.getJSONObject(position);
                if (v == null) {
                    v = LayoutInflater.from(cont).inflate(R.layout.saved_articles_listitem, null);
                }           
                sath = (WebIView) v.findViewById(R.id.sathumbnail);
                sati = (TextView) v.findViewById(R.id.satitle);

                if(item.has("image") && sath != null)
                {
                    JSONObject thisImage = item.getJSONObject("image");
                    sath.reset();
                    sath.setImageUrl(thisImage.getString("thumbnail"));
                    sath.loadImage();
                }
                if(sati != null)
                {
                    sati.setText(item.getString("title"));
                }
            }else{
                return null;
            }
        }
        catch(Exception e)
        {
            Log.e("num", "Saved Art Error! " + e.toString());
        }
        return v;
    }
}
激活此类的代码如下所示:

ListView savedArtList = (ListView) sav.findViewById(R.id.savelist);
ArticleAdapter savedadapter = new ArticleAdapter(cont, flip);
ArtList.setAdapter(savedadapter);
编辑:

多亏了一些非常有用的建议,我才知道出了什么问题。每次添加新行时,Listview都会自行调整大小,因为我已将视图高度设置为“wrap_content”。我没有意识到这会导致问题,但一旦我将其设置为“fill_parent”(或在其他情况下设置的值),问题就消失了,我再也没有这个问题了。
再次感谢您提供的有益建议

getView将被多次调用-布局列表视图时调用每个可见单元格,绘制列表视图时调用每个可见单元格+更多。这是正常的行为,getView应该是高效的。您的图像和/或文本可能会使每个单元格的高度在加载时发生变化,这意味着其他单元格可能会变为可见/离开屏幕等。

getView将被多次调用-在布局列表视图时调用每个可见单元格,在绘制列表视图时调用每个可见单元格+更多。这是正常的行为,getView应该是高效的。您的图像和/或文本可能会使每个单元格的高度在加载时发生变化,这意味着其他单元格可能会变为可见/离开屏幕等。

您不能简单地写下您的问题吗?我刚刚编辑了它,如果不清楚,很抱歉。为了清楚起见,我想我应该解释我为什么要问这个问题以及这个问题。我的道歉。你不能简单地写下你的问题吗?我刚刚编辑了它,如果不清楚的话,很抱歉。为了清楚起见,我想我应该解释我为什么要问这个问题以及这个问题。我的道歉。谢谢你的留言。不过,我主要担心的是,当我有很多行时,getView经常被调用,因此每次尝试调用时都会缓存图像,这让人担心。因此,由于调用代码的次数太多,我最终导致程序速度变慢。我不知道WebIView如何处理loadImage,但您可能需要内存缓存&持久缓存(sdcard)。这样,如果url刚被下载(或从持久缓存中检索),就可以设置它,如果它不在内存缓存中,您可以查看它是否在持久缓存中,并从那里加载它(如果它存在)(可能比下载快&节省带宽)。如果您必须下载,请同时将其保存到永久缓存中。非常感谢!你关于loadimage的观点让我思考,我问了我的同事。我设法解决了这个问题。这是因为我创建的listview的高度设置为包装内容,所以每次添加新行时,listview都会重新生成自己!谢谢你的留言。不过,我主要担心的是,当我有很多行时,getView经常被调用,因此每次尝试调用时都会缓存图像,这让人担心。因此,由于调用代码的次数太多,我最终导致程序速度变慢。我不知道WebIView如何处理loadImage,但您可能需要内存缓存&持久缓存(sdcard)。这样,如果url刚被下载(或从持久缓存中检索),就可以设置它,如果它不在内存缓存中,您可以查看它是否在持久缓存中,并从那里加载它(如果它存在)(可能比下载快&节省带宽)。如果您必须下载,请同时将其保存到永久缓存中。非常感谢!你关于loadimage的观点让我思考,我问了我的同事。我设法解决了这个问题。这是因为我创建的listview的高度设置为包装内容,所以每次添加新行时,listview都会重新生成自己!