3

HTTP リクエストを実行して結果を取得しています。次に、これらの結果をスクロールして、結果ごとに次のように作成します: (RL = Relative Layout)

ここに画像の説明を入力

内部に TextView と ImageView がある相対レイアウト (写真の RL)。次に、これらの「コンテナ」をすべてリストに追加し、解釈のために渡したいと思います。

//inside onPostExecute - given a list

List<RelativeLayout> containers = new ArrayList<RelativeLayout>();

for(i=0; i<alist.size();i++){
  RelativeLayout newLayout = new RelativeLayout(getApplicationContext());
  TextView tv = new TextView(getApplicationContext());
  ImageView iv = new ImageView(getApplicationContext());
  newLayout.addView(tv);
  newLayout.addView(iv);

  containers.add(newLayout);
}

otherClass.send(containers);

私は基本的に、プログラムでコンテナーを作成し、その中に 2 つのものを入れて、さらに処理するために送信したいと考えています。

(これは可能ですか、またはこれを行うためのより良い方法はありますか?) *EDITED

助けてくれてありがとう、私はすでにこれに多くの時間を費やしてきました


*私はこれを試しましたが、私が思うレイアウトのリストを渡そうとすると例外がスローされます


ここにさらに追加します:

public void send(List<RelativeLayout> containers) {

        for(int i=0; i<containers.size(); i++){
            RelativeLayout rl = new RelativeLayout(mContext);
            rl = containers.get(i);
            icons_row.addView(rl);
        }
    }

そして例外

03-29 10:20:32.290: E/AndroidRuntime(29782): FATAL EXCEPTION: main
03-29 10:20:32.290: E/AndroidRuntime(29782): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
03-29 10:20:32.290: E/AndroidRuntime(29782):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3618)
03-29 10:20:32.290: E/AndroidRuntime(29782):    at android.view.ViewGroup.addView(ViewGroup.java:3489)
03-29 10:20:32.290: E/AndroidRuntime(29782):    at android.view.ViewGroup.addView(ViewGroup.java:3434)
03-29 10:20:32.290: E/AndroidRuntime(29782):    at android.view.ViewGroup.addView(ViewGroup.java:3410)
4

1 に答える 1

2

よし、行きましょう。これはHTTPリクエストの後に行われるため、非同期タスクを実装していることに注意してください。質問とは関係がないため、そのビットを省略しました。

まず、モノのリストを 3 つ作成します。1 つのレイアウトのリスト (コンテナーのような外側の div)、1 つのテキスト ビューのリスト、および 1 つのイメージビューのリスト。私の例では、ビジネスと呼ばれる独自のクラスのリストをループしました。

 private List<RelativeLayout> layoutContainers = new ArrayList<RelativeLayout>();
 private List<TextView> textContainers = new ArrayList<TextView>();
 private List<ImageView> imageContainers = new ArrayList<ImageView>();

....

@Override
protected void onPostExecute(List<Business> blist){

  for(int i=0;i<blist.size();i++){

     RelativeLayout newLayout = new RelativeLayout(mContext);

    TextView tv = new TextView(mContext);
    ImageView iv = new ImageView(mContext); //// or getApplicationContext()

    tv.setId(1); iv.setId(2);

    newLayout.addView(tv);
    newLayout.addView(iv);
    icons_row.addView(newLayout); // this is another relative layout created via XML as standard


    RelativeLayout.LayoutParams layoutParms = (RelativeLayout.LayoutParams)newLayout.getLayoutParams();
    RelativeLayout.LayoutParams textParms = (RelativeLayout.LayoutParams)tv.getLayoutParams();
    RelativeLayout.LayoutParams imageParms = (RelativeLayout.LayoutParams)iv.getLayoutParams();

    layoutParms.height = RelativeLayout.LayoutParams.MATCH_PARENT;
    layoutParms.width = 175;
    newLayout.setGravity(Gravity.CENTER_VERTICAL);

    // Text Styling         
    textParms.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
    textParms.width = RelativeLayout.LayoutParams.MATCH_PARENT;
    tv.setBackgroundColor(R.drawable.my_border);
    tv.setPadding(1, 5, 1, 2);
    tv.setTextColor(Color.GREEN);
    tv.setGravity(Gravity.CENTER_HORIZONTAL); // center text

    // Image Styling - background set deeper inside         
    imageParms.addRule(RelativeLayout.BELOW, tv.getId());
    imageParms.setMargins(35, 0, 0, 0);
    imageParms.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
    imageParms.width = RelativeLayout.LayoutParams.WRAP_CONTENT;

    // set the params   
    tv.setLayoutParams(textParms);
    iv.setLayoutParams(imageParms);
    newLayout.setLayoutParams(layoutParms);

    // add them to the lists (created above)
    textContainers.add(tv);
    imageContainers.add(iv);
    layoutContainers.add(newLayout);
            }

        bearingTextView = (TextView)findViewById(R.id.bearingTextView);
        gps.calculateBearing(compass, bearingTextView ,blist, textContainers, imageContainers,layoutContainers);

} // end on Post Execute

私はそれらを GPS に送信し、それからコンパスに送信しました。テキストを更新するなど、それらに変更を加えるには、次の手順を実行します... たとえば、上記の calculateBearing メソッドを使用します... 他の値は無視し、コンテナのみを使用します。


public class Gps{
    private List<TextView> textContainers;
    private List<ImageView> imageContainers;
    private List<RelativeLayout> layoutContainers;

...

public void calculateBearing(Compass compass, TextView bearingText, List<Business> blist,                   List<TextView> textContainers,List<ImageView> imageContainers,List<RelativeLayout> layoutContainers){
    this.textContainers = textContainers;
    this.imageContainers = imageContainers;
    this.layoutContainers = layoutContainers;

    //eg. change the text
        for(int i=0; i<textContainers.size(); i++){
        textContainers.get(i).setText("This is text field: " + Integer.toString(i)); // will return, 1,2,3 etc depending on whatever textField is there
    }

   }
 }

これらの外部メソッドを onPostExecute から呼び出すので、UI が更新されることに注意してください。不明な点がある場合はお知らせください

于 2013-03-29T18:04:45.443 に答える