Как получить каждое представление из метода addView () динамически? - PullRequest
0 голосов
/ 08 октября 2019

Итак, у меня есть макет с адаптером ViewViewFlipper внутри. И я установил индикатор выполнения в верхней части основного вида макета с помощью метода addView(), поэтому, когда макет адаптераViewViewFlipper имеет значение ex: 4, тогда мой индикатор выполнения также равен 4. Но вместо этого каждый макет изменяется в соответствии с каждым индикатором выполнения, мой индикатор выполнения запускается4 из них одновременно. Вот результат, похожий на мой код.

Вот мой MainActivity:

public class MainActivity extends AppCompatActivity {

private AdapterViewFlipper mViewFlipper;
private MyAdapter mAdapter;
private LinearLayout mLayout;
private ProgressBar progressBar;

private int childCount;

private String[] values = {"satu", "dua", "tiga", "empat"};
private int[] colors =  {Color.BLUE, Color.GRAY, Color.GREEN, Color.RED};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mViewFlipper = findViewById(R.id.viewflipper);
    mLayout = findViewById(R.id.layoutParent);

    mAdapter = new MyAdapter(values, colors);

    mViewFlipper.setAdapter(mAdapter);
    mViewFlipper.setFlipInterval(2500);
    childCount = mViewFlipper.getCount();
    mViewFlipper.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
            if (mViewFlipper.getDisplayedChild() == childCount - 1) {
                mViewFlipper.stopFlipping();
            }
        }
    });
    mViewFlipper.startFlipping();

    for (int i = 0; i < childCount; i++) {
        View view = LayoutInflater.from(this).inflate(R.layout.progress, null);
        view.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
        progressBar = view.findViewById(R.id.bar);
        setMargins(progressBar, 0, 0, 8, 0);
        setProgressMax(progressBar, 100);
        setProgressAnimate(progressBar, 100);
        mLayout.addView(progressBar);
    }

}

private void setProgressMax(ProgressBar pb, int max) {
    pb.setMax(max * 1000);
}

private void setProgressAnimate(ProgressBar pb, int progressTo)
{
    ObjectAnimator animation = ObjectAnimator.ofInt(pb, "progress", pb.getProgress(), progressTo * 1000);
    animation.setDuration(2500);
    animation.setInterpolator(new LinearInterpolator());
    animation.start();
}

private void setMargins (View view, int left, int top, int right, int bottom) {
    if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        p.setMargins(left, top, right, bottom);
        view.requestLayout();
    }
}

}

Что я действительно хочу, так это каждый прогрессбар для каждого макета. Например, когда выполняется первый индикатор выполнения, затем запускается второй индикатор выполнения и т. Д., Как у моего adapterViewFlipper. Как я могу это исправить? спасибо.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Я наконец-то решил эту проблему. Вот мое решение:

private ProgressBar[] progressBar1;

progressBar1 = new ProgressBar[childCount];
    for (int e = 0; e < childCount; e++) {
        progressBar1[e] = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
        progressBar1[e].setLayoutParams(new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1));
        setMargins(progressBar1[e], 0, 0, 8, 0);
        setProgressMax(progressBar1[e], 100);
        viewGroup = findViewById(R.id.layoutParent);
        viewGroup.addView(progressBar1[e]);
    }

    mViewFlipper.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
            if (mViewFlipper.getDisplayedChild() == childCount - 1) {
                mViewFlipper.stopFlipping();
            }
            setProgressAnimate(progressBar1[mViewFlipper.getDisplayedChild()], 100);
        }
    });

    mViewFlipper.startFlipping();
0 голосов
/ 08 октября 2019

Вы должны показать Progreess Bar в addOnLayoutChangeListener

mViewFlipper.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
        if (mViewFlipper.getDisplayedChild() == childCount - 1) {
            mViewFlipper.stopFlipping();
        } else {
           View view = LayoutInflater.from(this).inflate(R.layout.progress, null);
           view.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
           progressBar = view.findViewById(R.id.bar);
           setMargins(progressBar, 0, 0, 8, 0);
           setProgressMax(progressBar, 100);
           setProgressAnimate(progressBar, 100);
           mLayout.addView(progressBar);
        }
    }
});
...