1

我已经构建了一个自定义 CursorAdapter,它需要用推文填充 ListView ......只会显示简单的日期和推文......效果很好,唯一的事情是如果我添加一个日志条目,我会注意到 BindView 方法每个项目每 8 秒被连续调用一次...这与屏幕上其他地方的 ViewFlipper 的翻转持续时间相对应...(通过更改持续时间并看到 BindView 以新的间隔时间被调用来验证)

ViewFlipper 确实使用与 ViewList 相同的布局 xml 和相同的数据(尽管我对数据库进行了 2 次单独调用以加载它们)

这是正常行为吗?

呈现 List 和 Flipper 的方法:

公共无效负载TwitterFeed(){

    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;
}

}
4

2 回答 2

2

它工作得很好,唯一的事情是,如果我添加一个日志条目,我注意到 BindView 方法每 8 秒连续调用每个项目

我怀疑bindView对 中的所有项目都ListView调用了该方法,很可能为可见项目调用了该方法(加上一些额外的调用)。

ViewFillper翻阅它的孩子时,Android 需要重新布局当前屏幕内容,这可能是您的方法在's 切换间隔bindView被调用的原因。ViewFlipper对你来说应该没关系。

于 2012-07-16T10:51:14.427 回答
0

正如 Luksprog 解释的那样,这是正常行为。每当需要显示一行时,每次都会调用方法 bindView。如果您担心性能(列表和广泛的受众,您通常应该这样做)并且不要在每次翻转时更改列表的内容(行),您可能需要考虑覆盖newView而不是bindView,如果/如果适用,缓存等.

于 2014-12-09T15:00:47.110 回答