2

LinearLayoutレイアウト XML から拡張されたアイテムのリストを内に動的に追加したいと考えていますScrollViewfindViewByIdこれには、アイテムごとに何度も電話をかける必要があり、非常に費用がかかると言われています. これを回避するためにビューをリサイクルするにはどうすればよいですか?

ただし、各アイテムにはListViewコンテンツとコメント要素をいくつでも含めることができ、Google I/O 2010 - The world of ListViewListViews を過度に複雑にするべきではないと言われました。

関連するメソッドのコードは次のとおりです。

private void addQuotes(NodeList quoteNodeList){

    LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    for(int i = 0; i < quoteNodeList.getLength(); i++){

        Log.i(getClass().getSimpleName(), "Adding quote number " + i);

        Node quoteNode = quoteNodeList.item(i);
        // Inflate view to hold multiple content items, single additional content TextView, and multiple comment items
        LinearLayout quote = (LinearLayout) layoutInflater.inflate(R.layout.quote, null);
        LinearLayout contentList = (LinearLayout) quote.findViewById(R.id.dialog_list);
        TextView additionalContent = (TextView) quote.findViewById(R.id.additional_content);
        LinearLayout commentList = (LinearLayout) quote.findViewById(R.id.comment_list);

        // Get data for content items and add to contentList
        NodeList contentNodeList =
                XmlUtilities.getChildWithTagName(quoteNode, NetworkHelper.XML_TAG_QUOTE_CONTENT).getChildNodes();
        for(int contentIndex = 0; contentIndex < contentNodeList.getLength(); contentIndex++){

            Log.i(getClass().getSimpleName(), "Adding content number " + contentIndex + " to quote number " + i);

            Node contentItemNode = contentNodeList.item(contentIndex);
            // Inflate view to hold name and dialog TextViews
            LinearLayout contentItem = (LinearLayout) layoutInflater.inflate(R.layout.dialog_item, null);
            TextView nameView = (TextView) contentItem.findViewById(R.id.speaker);
            TextView dialogView = (TextView) contentItem.findViewById(R.id.dialog);
            // Get data and insert into views
            String nameString = XmlUtilities.getChildTextValue(contentItemNode, NetworkHelper.XML_TAG_QUOTE_CONTENT_ITEM_NAME);
            String dialogString = XmlUtilities.getChildTextValue(contentItemNode, NetworkHelper.XML_TAG_QUOTE_CONTENT_ITEM_DIALOG);
            nameView.setText(nameString + ":");
            dialogView.setText("\"" + dialogString + "\"");
            // Add to parent view
            contentList.addView(contentItem);
        }

        // Get additional content data and add
        String additionalContentString = XmlUtilities.getChildTextValue(
                quoteNode, NetworkHelper.XML_TAG_QUOTE_ADDITIONAL_CONTENT);
        Log.d(getClass().getSimpleName(), "additionalContentString: " + additionalContentString);
        additionalContent.setText(additionalContentString);

        // TODO: Get comment data and add

        // Add everything to ScrollView
        mQuoteList.addView(quote);
        Log.d(getClass().getSimpleName(), "additionalContent: " + additionalContent.getText());

    }

パラメータquoteNodeListorg.w3c.dom.NodeList. XmlUtilities私が自分で書いたヘルパー クラスですが、メソッドは一目瞭然です。

どんな助けでも大歓迎です。

4

1 に答える 1

4

これには、アイテムごとに findViewById を何度も呼び出す必要があり、非常にコストがかかると言われています。

インフレ自体ほど高くはありません。10,000 のコメントがある場合、10,000 行が膨張し、ヒープ領域が不足したり、UI 全体が長時間フリーズしたりするリスクがあります。

これを回避するためにビューをリサイクルするにはどうすればよいですか?

あなたの構造を考えると、できません。

私は ListView を使用しますが、各項目には任意の数のコンテンツ要素とコメント要素を含めることができ、Google I/O 2010 - The world of ListViews で ListView を過度に複雑にするべきではないと言われました。

提案されたソリューションは大幅に「過度に複雑」になるため (2 桁または 3 桁)、a を使用しListViewます。

于 2013-02-18T16:45:05.147 に答える