2014-09-12 101 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