3

大きな説明 (より安全な...)、すべてを読みたくない場合は、太字で質問してください。助けてくれてどうもありがとう!

ListViewと 2 つのカスタム XMLを持つアプリがあります。1 つは、ヘッダー用の単一の TextView です。もう一方には、データを表す 3 つの TextView と 3 つの ImageView があります。

ほとんどの人が知っているように、Jeff Sharkeyは既に非常に巧妙な (imho) ソリューション( SeparatedListAdapter) を持っています。これにより、クラスは変更なしで ImageView で機能します。Strings を受け入れますvalueOfが、drawable int リソースの を提供できます。最後にコードと画面を参照してください (簡単にするために、彼のクラスはここにはありません)。

問題は、私のプロジェクトでは、使用する社内の独自コードのスタックが与えられていることです。また、Sharkey のコードは GPLv3 であり、私が彼のコードを使用する可能性を排除しています。したがって、他のコードが GPL の力に「引き付けられる」ことなく、そのコードにリンクできるようにする解決策を知っているかもしれません。私はそれの政治について話し合っているわけではないので、そうでない場合は感謝します. その上、私は回避しているのではなく、合法的に回避しています。

今のところ、 ASL 2 であるcwac-mergeを見つけることができました。しかし、これまでのところ、文字列とドローアブルをカスタム XML レイアウトのカスタム TextView と ImageView に「マップ」することはできませんでした。また、サンプルアプリは、リモートで必要と思われるものとはまったく異なるアプローチを使用しています。

私が何をしようとしているのか知りたい場合は、SeparatedListAdapter以下のクラスを参照してください。cwac-merge の場合は、何があっても強制終了するので、あえて投稿しません。

package com.uitests;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class TestActivity extends ListActivity {

public final static String ITEM_TITLE = "title";
public final static String ITEM_STATE = "state";
public final static String ITEM_TEMPERATURE = "temperature";
public final static String ITEM_UP = "up";
public final static String ITEM_DOWN = "down";
public final static String ITEM_LEVEL = "level";

public Map<String,?> createItem(
        String title, String state, String temperature, 
        String upImage, String downImage, String levelImage) {  

    Map<String,String> item = new HashMap<String,String>();  
    item.put(ITEM_TITLE, title);  
    item.put(ITEM_STATE, state);
    item.put(ITEM_TEMPERATURE, temperature);
    item.put(ITEM_UP, upImage);
    item.put(ITEM_DOWN, downImage);
    item.put(ITEM_LEVEL, levelImage);
    return item;  
}


@Override  
public void onCreate(Bundle icicle) {  
    super.onCreate(icicle);

    // THIS IS JUST AN EXAMPLE TO POPULATE THE LIST FOR STACKOVERFLOW!

    List<Map<String,?>> controlA = new LinkedList<Map<String,?>>();  
    controlA.add(createItem(
            "Monitor 001AK", 
            "Functional", 
            "27", 
            String.valueOf(R.drawable.ic_up),
            String.valueOf(R.drawable.ic_down_off),
            String.valueOf(R.drawable.ic_level07)));
    // MORE .adds HERE

    List<Map<String,?>> controlB = new LinkedList<Map<String,?>>();  
    controlB.add(createItem(
            "Monitor 003CK", 
            "Functional", 
            "29", 
            String.valueOf(R.drawable.ic_up),
            String.valueOf(R.drawable.ic_down_off),
            String.valueOf(R.drawable.ic_level07)));
    // MORE .adds HERE

    SeparatedListAdapter adapter = new SeparatedListAdapter(this);  

    adapter.addSection(
            "Control 1", 
            new SimpleAdapter(
                    this, 
                    controlA, 
                    R.layout.equip_row,  
                    new String[] { 
                            ITEM_TITLE, 
                            ITEM_STATE, 
                            ITEM_TEMPERATURE, 
                            ITEM_UP, 
                            ITEM_DOWN, 
                            ITEM_LEVEL }, 
                    new int[] { 
                            R.id.tide_row_title, // TextView
                            R.id.tide_row_state, // TextView 
                            R.id.tide_row_temperature, // TextView
                            R.id.tide_row_img_up, // ImageView
                            R.id.tide_row_img_down, // ImageView
                            R.id.tide_row_img_level } // ImageView
            )
    );  

    adapter.addSection(
            "Control 2", 
            new SimpleAdapter(
                    this, 
                    controlB, 
                    R.layout.equip_row,  
                    new String[] { 
                            ITEM_TITLE, 
                            ITEM_STATE, 
                            ITEM_TEMPERATURE, 
                            ITEM_UP, 
                            ITEM_DOWN, 
                            ITEM_LEVEL }, 
                    new int[] { 
                            R.id.tide_row_title, 
                            R.id.tide_row_state, 
                            R.id.tide_row_temperature,
                            R.id.tide_row_img_up,
                            R.id.tide_row_img_down,
                            R.id.tide_row_img_level }
            )
    );  

    this.getListView().setAdapter(adapter);  

}  

}

そのシンプルさのすべてが、この素晴らしい画面につながります。

Jeff Sharkey による Sectioned ListViews の実装

4

2 に答える 2

1

GPLv3 の主な目標の 1 つは、人々が以前のバージョンで見つけた抜け穴を悪用するのを防ぐことだと私は信じています。

これがあなたにとってショーストッパーである場合は、Jeff に連絡して、別の条件でコードをライセンスできるかどうかを確認する価値があるかもしれません.コードに GPL を適用しても、別のライセンスの下で作者/著作権保持者によってコードが利用可能になるのを止めることはできません.

そうは言っても、展開/折りたたみ動作をオーバーライドすると、 ExpandableListAdapterExpandableListViewはほぼ同じ仕事をしませんか?

お役に立てれば、

フィル・レロ

于 2011-04-16T04:55:13.840 に答える
0

OK、cwac-mergeを使用してなんとか機能させることができました。ここの人たちに助けてもらいました。

車輪の再発明はしないので、そこにある情報 (使用されているコードを含む) をすべて読むことができます。必要に応じて明確にすることができます。聞いてください、私がお手伝いします。

于 2011-04-17T15:39:19.480 に答える