2014-09-12 60 views
0

我正在使用reddit API并尝试加载线程的注释树。我的问题是,我正在使用递归功能来做到这一点。我正在构建一个视图,然后以编程方式添加它。它适用于小线程,但是当它需要加载一个大的注释树时,我得到了stackoverflow.So我的主要问题是:什么是以编程方式加载嵌套注释的好方法,以及绕过堆栈溢出的最佳做法是什么?我有争论添加一个计数器添加评论,当他们超过了一些数字,我可能会打破循环,但这仍然不能保证我的“stackoverflow”免费程序。一般来说,我如何跟踪堆栈和堆?另外作为后续问题:我的动态视图在旋转时被破坏,并且每次都重新创建。与此相关的问题是重新创建速度很慢,并且会减慢轮换速度。那么是否有一种简单的方法来保存/保存旋转视图并再次添加它(setRetainInstance(true)对动态视图没有影响,仅在主布局上)。递归函数和注释树

private void addTextTree(JSONObject j, LinearLayout layoutparent) throws JSONException { 
    JSONObject j2 = j.getJSONObject("data"); 
    JSONArray j3 = j2.getJSONArray("children"); 
    LinearLayout currentparent = layoutparent; 
    Log.d("ADDINGVIEW", j3.length() + ""); 
    for (int i = 0; i < j3.length(); i++) { 
     JSONObject j4 = j3.getJSONObject(i); 
     JSONObject j5 = j4.getJSONObject("data"); 
     addComment(j5, currentparent); 
    } 
} 

private void addComment(JSONObject j, LinearLayout parent) throws JSONException { 
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
    LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 

    LinearLayout LLHmain = new LinearLayout(getActivity()); 
    LinearLayout LLVsecond = new LinearLayout(getActivity()); 

    LLHmain.setOrientation(LinearLayout.HORIZONTAL); 
    LLHmain.setLayoutParams(lp); 
    LLVsecond.setOrientation(LinearLayout.VERTICAL); 
    LLVsecond.setLayoutParams(lp1); 

    TextView author = new TextView(getActivity()); 
    TextView content = new TextView(getActivity()); 

    ImageView bar = new ImageView(getActivity()); 
    bar.setBackgroundResource(R.drawable.lines); 
    LLHmain.addView(bar, lp1); 

    author.setText(" " + j.optString("author") + " " + j.optInt("score") + " points"); 
    author.setBackgroundResource(R.drawable.border); 
    String temp = j.optString("body_html"); 
    String temp1 = Html.fromHtml(temp.substring(22, temp.length() - 12)).toString(); 
    content.setText(Html.fromHtml(temp1)); 
    content.setAutoLinkMask(Linkify.WEB_URLS); 
    content.setMovementMethod(LinkMovementMethod.getInstance()); 
    LLVsecond.addView(author, lp); 
    LLVsecond.addView(content, lp); 
    LLHmain.addView(LLVsecond, lp1); 
    parent.addView(LLHmain, lp); 
    if (!j.optString("replies").equals("")) { 
     JSONObject replies = j.getJSONObject("replies"); 
     addTextTree(replies, LLVsecond); 
    } 
} 

概括:

  1. 什么是处理textviews装载树木和防止堆栈溢出的最佳方式。栈和堆
  2. 上旋转保存动态视图

免责声明

  • 饲养的轨道:我是新来的任何类型的节目内容,并绝非我相信这是最好或唯一途径做到这一点。对于我的问题,我愿意接受任何可能的解决方案。

  • 回答

    0

    我给的回答很短的版本(因为我在工作繁忙还挺),但你跟着它,你会得到你想要的东西:

    问题是View是内存重对象,不应该分配那么多。你要做的是避免使用可以回收视图的ListView

    所以不是递归创建并添加视图,您将创建一个数据类,例如:

    public class DataItem{ 
        String author; 
        String content; 
    } 
    

    那么你建立一个ArrayList<DataItem>和递归的所有项目添加到这个阵列。然后,您在listviewadapter中使用此数组。

    这样你就可以拥有一个有数千个项目而没有问题的线程。

    +0

    您的建议看起来像[这非常糟糕的绘图](http://i.imgur.com/OHckIxf.png?1?2602)?我已经使用listfragment/listview,但没有任何嵌套,所以我不确定如何包裹我的头。这张照片是否与你心目中的相似? – user3542472 2014-09-12 22:38:21