Android - динамически изменять элемент пользовательского списка, например эффект слайд-шоу

У меня есть одно пользовательское представление списка, в котором используются четыре элемента, изображение и три текстовых представления. и у меня есть пять uri изображений для каждого изображения в списке, и я хочу динамически менять изображение в течение некоторого времени для определенного элемента изображения. Я применил поток для динамического изменения изображения, но он работает только с одним элементом списка за раз. Я хочу динамически изменять каждый элемент изображения в списке. Что я делаю. Я иду в правильном направлении, или я должен попробовать что-нибудь еще. Пожалуйста, кто-нибудь предложит мне. Помощь будет высоко оценена.. Заранее спасибо :)

вот мой код getView-

final AQuery recycle = aq.recycle(view);

final Handler mHandler = new Handler();

// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {

           animate_slide(recycle , currentimageindex);
           currentimageindex++;

        if(currentimageindex > 4){
            currentimageindex = 0;
                    }
            }
        };
        Timer timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {

        public void run() {

                   mHandler.post(mUpdateResults);

                  }

            }, delay, period);

и метод, который я вызываю для анимации-

private void animate_slide(AQuery recycle ,int ci) {

                            if(ci == 0){
                                Log.d("00000000000000","----------"+ci);
                                recycle.id(R.id.avatar).progress(R.id.progress).image(ApplicationConstants.IMG_URL_SUFFIX+picture.get(currentimageindex), true, true, 100, 0, null, AQuery.FADE_IN);
                            }else if(ci == 1){
                                Log.d("11111111111111","----------"+ci);
                                recycle.id(R.id.avatar).progress(R.id.progress).image(ApplicationConstants.IMG_URL_SUFFIX+picture1.get(currentimageindex), true, true, 100, 0, null, AQuery.FADE_IN);
                            }else if(ci == 2){
                                Log.d("2222222222222222","----------"+ci);
                                recycle.id(R.id.avatar).progress(R.id.progress).image(ApplicationConstants.IMG_URL_SUFFIX+picture2.get(currentimageindex), true, true, 100, 0, null, AQuery.FADE_IN);
                            }else if(ci == 3){
                                Log.d("3333333333333333","----------"+ci);
                                recycle.id(R.id.avatar).progress(R.id.progress).image(ApplicationConstants.IMG_URL_SUFFIX+picture3.get(currentimageindex), true, true, 100, 0, null, AQuery.FADE_IN);
                            }else if(ci == 4){
                                Log.d("00000000000000","----------"+ci);
                                recycle.id(R.id.avatar).progress(R.id.progress).image(ApplicationConstants.IMG_URL_SUFFIX+picture4.get(currentimageindex), true, true, 100, 0, null, AQuery.FADE_IN);

                            }

                        }

person Priyanka    schedule 12.06.2013    source источник
comment
Я использую тот же процесс со статическим значением, чем это работает нормально ... но почему не работает с динамическим значением?   -  person Priyanka    schedule 12.06.2013
comment
Вы вызываете свой код getView для каждого нового увеличенного представления? Не могли бы вы предоставить полный код getView?   -  person a.ch.    schedule 26.12.2013


Ответы (2)


вы можете использовать Gallary в своем XML-файле getView, и у вас может быть какая-то работа там

person Amit    schedule 10.04.2014

Не нужно делать это таким сложным. Я думаю, что только первый элемент в списке анимирует, я прав?

Я предлагаю не использовать новый runnable и изменить свой getView() следующим образом (я предполагаю, что currentimageindex в вашем коде - это позиция элемента в ListView):

// The view holder for better ListView
private class ViewHolder {
    TextView text1, text2, text3;
    ImageView image;
}

@Override
public View getView(int position, View view, ViewGroup parent) {

    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        /* Initialize views and add them to  the ViewHolder
         * 
         * ....
         * 
        */
        // Setting the position as a tag, so we can get it in the runnable
        holder.image.setTag(position);
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                animate_slide(aq.recycle(holder.image), (int) holder.image.getTag());
            }

        }, when, period);
        view.setTag(holder);
    } else holder = (ViewHolder) view.getTag();

    /* do what you want with the texts...
     * 
     * ....
     * 
    */  

    return view;

}

EDIT: я нашел более простое решение. :) Нам не нужна никакая другая нить. Внутри getView() поместите этот код, и он автоматически запустит анимацию:

    // At first we load the animation 
    Animation slideAnimation = AnimationUtils.loadAnimation(context , R.anim.fade_in);
    slideAnimation.setRepeatMode(Animation.INFINITE);

    slideAnimation.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationStart(Animation arg0) {/* Nothing*/}

        @Override
        public void onAnimationEnd(Animation animation) {
            yourImageView.setImageResource(R.drawable.newResource);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // Setting a delay after each animation.
            // This is the time between two animations.
            animation.setStartOffset(period);
        }

    });

    yourImageView.startAnimation(slideAnimation);

Наконец, не забудьте отменить анимацию, потому что мы сказали slideAnimation.setRepeatMode(Animation.INFINITE);. Я предлагаю добавить этот метод в ваш класс адаптера:

public void onDestroy() {
    slideAnimation.cancel();
}

И это в вашей деятельности:

    @Override
    public void onDestroy() {
        super.onDestroy();
        yourListAdapter.onDestroy();
    }

Надеюсь, это поможет :)

person Mohamad Amin    schedule 18.07.2014