Android - пользовательский CursorAdapter продолжает вызывать BindView, когда ViewFlipper переворачивается

1

Я создал пользовательский CursorAdapter, который должен заполнить ListView твитами... Будет показана простая дата и твит... Это отлично работает, единственное, что, если я добавлю запись в журнал, я замечаю, что метод BindView непрерывно набирается каждый раз каждые 8 секунд для каждого элемента... Что соответствует флип-D ViewFlipper в другом месте на экране... (Проверяется путем изменения продолжительности и просмотра BindView с новыми интервалами времени)

ViewFlipper использует тот же макет xml, что и ViewList, и те же данные (хотя я делаю 2 отдельных вызова в БД для их загрузки)

Это нормальное поведение?

Метод, который отображает список и флиппер:

public void loadTwitterFeed() {

    ListView twitterList = (ListView) findViewById(R.id.twitterList);

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    dbHelper dbh = new dbHelper(this);

    dbh.openRead();

    twitterDbAdapter adapt = new twitterDbAdapter(this, dbh.getTweets());

    twitterList.setAdapter(adapt);

    ViewFlipper flipper = (ViewFlipper) findViewById(R.id.twitterFlipper);

    ArrayList<twitterTweet> tweets = dbh.getTweetsAsList();

    for( twitterTweet obj : tweets){

        View tItem = (View) inflater.inflate(R.layout.twitter_item, flipper, false);

        TextView tv1 = (TextView) tItem.findViewById(R.id.textView1);
        TextView tv2 = (TextView) tItem.findViewById(R.id.textView2);

        tv1.setText(obj.getDate());
        tv2.setText(obj.getText());

        flipper.addView(tItem);

    }

    dbh.close();

    flipper.setFlipInterval(5000);
    flipper.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_in_left));
    flipper.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_out_right));
    flipper.startFlipping();

}

Мой пользовательский адаптер:

public class twitterDbAdapter extends CursorAdapter{
private LayoutInflater inflater;

public twitterDbAdapter(Context context, Cursor cursor){

    super(context, cursor);
    inflater = LayoutInflater.from(context);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    Log.i("extra","binding");
    TextView textView = (TextView) view.findViewById(R.id.textView1);
    TextView textView2 = (TextView) view.findViewById(R.id.textView2);

    textView.setText(cursor.getString(cursor.getColumnIndex("createdat")));
    textView2.setText(cursor.getString(cursor.getColumnIndex("tweet")));

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = inflater.inflate(R.layout.twitter_item, parent, false);
    return view;
}

}
Теги:
android-cursoradapter

2 ответа

2
Лучший ответ

Он отлично работает, единственное, что, если я добавлю запись в журнал, я замечаю, что метод BindView получает вызов непрерывно каждые 8 секунд для каждого элемента

Я сомневаюсь, что bindView вызывается для всех элементов в ListView, скорее всего, метод вызывается для видимых элементов (плюс несколько дополнительных вызовов).

По мере того, как ViewFillper просматривает его, дети Android должны повторно отображать текущее содержимое экрана, это, вероятно, является причиной bindView метода ViewFlipper интервале переключения ViewFlipper. Это не важно для вас.

  • 0
    Отлично, именно то, что я хотел услышать :) спасибо!
0

Это нормальное поведение, как объяснил Лукспрог. Метод bindView вызывается всякий раз, когда строка должна отображаться каждый раз. Если вас беспокоит производительность (со списками и широкой аудиторией, вы часто должны быть) и не меняйте содержимое списка (строк) с каждым переворотом, вы можете рассмотреть возможность переопределения newView вместо bindView, если/где это применимо, кэширование, и т.д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню