Действительно ли возможно присвоить объект интервалу?

После долгих поисков этой проблемы я нашел действительно хорошее решение, которое я считаю правильным. По сути, instantiateItem вызывается только тогда, когда создается экземпляр представления, и никогда больше, если только представление не разрушено (это то, что происходит, когда вы переопределяете функцию getItemPosition для возврата POSITION_NONE). Вместо этого вам нужно сохранить созданные представления и либо обновить их в адаптере, сгенерировать функцию get, чтобы кто-то другой мог ее обновить, либо функцию set, которая обновляет адаптер (мой любимый).

Итак, в вашем MyViewPagerAdapter добавьте переменную, такую ​​как:

private View updatableView;

a в вашем instantiateItem:

 public Object instantiateItem(View collection, int position) {
        updatableView = new TextView(ctx); //My change is here
        view.setText(data.get(position));
        ((ViewPager)collection).addView(view);
        return view;
    }

, таким образом, вы можете создать функцию, которая будет обновлять ваш просмотр:

public updateText(String txt)
{
    ((TextView)updatableView).setText(txt);
}

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

6
задан jackhab 15 July 2009 в 09:48
поделиться

7 ответов

Вам необходимо определить оператор приведения, который преобразует CCounter в int. Добавьте этого члена в свой класс:

operator int() const {
  return ...;
}
17
ответ дан 8 December 2019 в 03:27
поделиться

Как вы узнали, оператор присваивания должен быть функцией-членом класса. Поскольку целые числа не являются классами, вы не можете написать для них operator = (). Альтернатива, как указывали другие, - написать функцию, которая преобразуется в int. Я настоятельно рекомендую вам написать для этого именованную функцию, например ToInt (), вместо использования оператора преобразования, который может быть источником неочевидных ошибок.

8
ответ дан 8 December 2019 в 03:27
поделиться

Добрый день,

Разве вы не должны вместо этого определять функцию доступа, если вы просто «получаете» текущее значение счетчика?

Что-то вроде:

int GetCounter();

] Все остальное лишь маскирует намерение того, что вы пытаетесь сделать. ИМХО Нэтч! (-:

HTH

ура,

1
ответ дан 8 December 2019 в 03:27
поделиться

Как сказано, используйте int () оператор. Вот фрагмент кода:

#include <iostream>

class CCounter
{
    public:
    CCounter(int i = 0) : _count(i) {}
    operator int() { return _count; }

    private:
    int _count;

};

int main()
{
    CCounter counter(4);
    int c = counter;
    std::cout << "Counter = " << c << std::endl;

    return 0;
}
1
ответ дан 8 December 2019 в 03:27
поделиться

Вам необходимо определить оператор int () , чтобы разрешить преобразование вашего класса в int. Например:

class CCounter
{
    public:
    CCounter(int val) : m_val(val)
    {
    }

     operator int() const
    {
        return m_val;
    }

    private:
    int m_val;
};





int main(int argc,char *argv[])
{
    CCounter c(10);
    int n = c;

    std::cout<<n<<"\n";

    return 0;
}  
1
ответ дан 8 December 2019 в 03:27
поделиться

Хотя вам было дано допустимое решение , я бы также подумал о том, чтобы просто создать обычную функцию, которая возвращает int , например int GetValue () const , чтобы улучшить читаемость и упростить обслуживание. Конечно, это очень субъективно.

0
ответ дан 8 December 2019 в 03:27
поделиться

You said:

"I've defined several operators like post/pre inc/dec returning an integer".

Now that other answers provided you with a generic way to convert the object to an integer, I would recommend that you change these other operators so that they behave as typically expected.

For instance, pre increment typically returns a reference to the object itself, and post increment typically returns a temporary copy of the original object (prior to the incrementation).

CCounter& operator++() {
    ++m_val;
    return *this;
}

CCounter operator++(int) {
    CCounter tmp(*this);
    ++m_val;
    return tmp;
}
1
ответ дан 8 December 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: