Android:JSONArray& JSONObject到ListView的奇怪读物

时间:2011-11-16 10:43:52

标签: android listview arrays

尝试使用以下内容:

Populate Listview from JSON

创建一个使用包含Json Objects的JsonArray的listview。出于某种原因, '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'(或其他情况下的设定值),问题就消失了,我不再有这个问题了。 再次感谢您提供有用的建议!

1 个答案:

答案 0 :(得分:1)

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