0

いくつかの相対的なレイアウトをダイナミックに作成する For ループを作成しました。「photosPathList」と呼ばれるいくつかの要素を持つarrayListがあります。この arrayList のサイズは、ループの最大数を定義するために使用されます。私が書いているこのコードは、Android のアクティビティの onResume() メソッド内にあります。私が理解していないことが1つあります。ループ内で i インデックスをログに記録すると、正しく増加し、ループごとに +1 の値が取得されます。しかし、相対レイアウト リスナーをクリックすると、i インデックスには常に最後のループ位置があります。したがって、4 つの相対レイアウトを作成し、最初のレイアウトをクリックすると、相対レイアウト内のログに 3 という数字が表示されます。0 という数字が表示されるはずなので、これは正しくありません。同意しますか?それで、私は何を間違っていますか?

for (i=0; i<= photosPathList.size()-1; i++) {

                //RELATIVE LAYOUT
                RelativeLayout relativeLayout = new RelativeLayout(this); //create a new relative layout
                relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, //set main params about the width and height
                        RelativeLayout.LayoutParams.FILL_PARENT));
                relativeLayout.setBackgroundColor(getResources().getColor(R.color.grayColor)); //set background color
                LinearLayout.LayoutParams relativeParams = new LinearLayout.LayoutParams(
                        new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT));
                relativeParams.setMargins(20, 20, 20, 0);
                relativeLayout.setLayoutParams(relativeParams); //set declared params about layout to the relativeLayout
                relativeLayout.requestLayout();
                Log.i("index",""+i);
                   Log.i("current path",""+photosPathList.get(i).toString());
                relativeLayout.setOnClickListener(new View.OnClickListener(){ //create a listener about the layout. When a user press a point inside the relative layout a new activity should be created
                     @Override
                     public void onClick(View v){
                         Intent photoDetailsActivity = new Intent(
                                getApplicationContext(),
                                PhotoDetails.class //assign the class for create a new intent
                            );
                         Log.i("index2",""+i);
                         photoDetailsActivity.putExtra("photoDetailsImagePath", photosPathList.get(i).toString());
                         photoDetailsActivity.putStringArrayListExtra("photosPathList" , photosPathList);
                         photoDetailsActivity.putStringArrayListExtra("formatPhotoList", formatPhotoList);
                         photoDetailsActivity.putStringArrayListExtra("numberCopiesPhotoList", numberCopiesPhotoList);
                         photoDetailsActivity.putStringArrayListExtra("pricePhotoList", pricePhotoList);
                         startActivity(photoDetailsActivity); //let's start the new activity
                     }
                 });
}

ありがとう

4

3 に答える 3

2

「i」変数は最終的なものではありません。

ここで理解しておく必要があること:

onClick メソッドが呼び出されると、このループ中に「i」の値が何であったかがわかりません。「i」を onClicklistener に渡す方法を見つける必要があります。

私の提案は、OnClickListener を実装し、int 変数を受け入れる新しいクラスを作成することです。この変数をクラス メンバーとして保存し、それを OnClick メソッドで使用します。

お役に立てれば :)

于 2013-10-14T10:37:25.517 に答える
0
// try this way
for (i=0; i<= photosPathList.size(); i++) {

            //RELATIVE LAYOUT
            RelativeLayout relativeLayout = new RelativeLayout(this); //create a new relative layout
            relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, //set main params about the width and height
                    RelativeLayout.LayoutParams.FILL_PARENT));
            relativeLayout.setBackgroundColor(getResources().getColor(R.color.grayColor)); //set background color
            LinearLayout.LayoutParams relativeParams = new LinearLayout.LayoutParams(
                    new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT));
            relativeParams.setMargins(20, 20, 20, 0);
            relativeLayout.setLayoutParams(relativeParams); //set declared params about layout to the relativeLayout
            relativeLayout.requestLayout();
            relativeLayout.setTag(i);
            relativeLayout.setOnClickListener(new View.OnClickListener(){ //create a listener about the layout. When a user press a point inside the relative layout a new activity should be created
                @Override
                public void onClick(View v){
                    Intent photoDetailsActivity = new Intent(
                            getApplicationContext(),
                            PhotoDetails.class //assign the class for create a new intent
                    );
                    int index = (Integer)v.getTag();
                    Log.i("index2",""+index);
                    photoDetailsActivity.putExtra("photoDetailsImagePath", photosPathList.get(index).toString());
                    photoDetailsActivity.putStringArrayListExtra("photosPathList" , photosPathList);
                    photoDetailsActivity.putStringArrayListExtra("formatPhotoList", formatPhotoList);
                    photoDetailsActivity.putStringArrayListExtra("numberCopiesPhotoList", numberCopiesPhotoList);
                    photoDetailsActivity.putStringArrayListExtra("pricePhotoList", pricePhotoList);
                    startActivity(photoDetailsActivity); //let's start the new activity
                }
            });
        }
于 2013-10-14T11:28:19.650 に答える
0

すべてのクリックイベントに同じ変数 i を使用しています。異なるカウンター変数を使用する必要があります。

于 2013-10-14T10:36:41.793 に答える