После долгих поисков этой проблемы я нашел действительно хорошее решение, которое я считаю правильным. По сути, 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);
}
Надеюсь, это поможет!
Вам необходимо определить оператор приведения, который преобразует CCounter в int. Добавьте этого члена в свой класс:
operator int() const {
return ...;
}
Как вы узнали, оператор присваивания должен быть функцией-членом класса. Поскольку целые числа не являются классами, вы не можете написать для них operator = (). Альтернатива, как указывали другие, - написать функцию, которая преобразуется в int. Я настоятельно рекомендую вам написать для этого именованную функцию, например ToInt (), вместо использования оператора преобразования, который может быть источником неочевидных ошибок.
Добрый день,
Разве вы не должны вместо этого определять функцию доступа, если вы просто «получаете» текущее значение счетчика?
Что-то вроде:
int GetCounter();
] Все остальное лишь маскирует намерение того, что вы пытаетесь сделать. ИМХО Нэтч! (-:
HTH
ура,
Как сказано, используйте 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;
}
Вам необходимо определить оператор 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;
}
Хотя вам было дано допустимое решение , я бы также подумал о том, чтобы просто создать обычную функцию, которая возвращает int , например int GetValue () const
, чтобы улучшить читаемость и упростить обслуживание. Конечно, это очень субъективно.
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;
}