【问题标题】:Android: JSONArray & JSONObject to ListView strange readingsAndroid:JSONArray & JSONObject to ListView 奇怪的读数
【发布时间】:2011-11-16 10:43:52
【问题描述】:

尝试使用以下方法:

Populate Listview from JSON

创建一个使用包含 Json 对象的 JsonArray 的列表视图。出于某种原因, 'public View getView(int position, View convertView, ViewGroup parent)' 代码被触发的次数多于 jsonarray 中的内容。

我做了一个控制测试来检查这一点,我发现即使 jsonarray 中只有 1 个 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”(或其他情况下的设置值),问题就消失了,我不再有这个问题了。 再次感谢您的有用建议!

【问题讨论】:

  • 你不能把你的问题简述一下吗?
  • 我刚刚编辑了它,如果不清楚,请见谅。为了清楚起见,我认为我应该解释我为什么要问这个问题。我的建议。

标签: android listview arrays


【解决方案1】:

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

【讨论】:

  • 感谢您的留言。不过,我主要担心的是,当我有很多行时,经常调用 getView ,因此每次尝试调用时都会缓存图像,因此令人担忧。因此,由于调用代码的次数,我最终导致程序变慢。
  • 我不知道 WebIView 如何处理 loadImage,但您可能想要一个内存缓存和一个持久缓存(sdcard)。这样,如果 url 刚刚被下载(或从持久缓存中检索),它可以被设置,如果它不在内存缓存中,您可以查看它是否在持久缓存中并从那里加载它如果它存在(可能比下载和节省带宽更快)。如果一定要下载,同时保存到持久化缓存中。
  • 非常感谢!你关于 loadimage 的观点让我思考,我问了我的同事。我设法解决了这个问题。这是因为我将创建的列表视图的高度设置为 wrap_content,因此每次添加新行时,列表视图都会重新生成!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多