1

ListView につぶやきを入力する必要があるカスタム CursorAdapter を作成しました...単純な日付とつぶやきが表示されます...うまく機能します。唯一のことは、ログエントリを追加すると、BindView メソッドがすべてのアイテムに対して8秒ごとに継続的に呼び出されています...これは、画面の他の場所にあるViewFlipperのflipDurationに対応しています...(期間を変更し、BindViewが新しい間隔時間で呼び出されることを確認して確認してください)

ViewFlipper は、ViewList と同じレイアウト xml と同じデータを使用します (ただし、DB を 2 回呼び出してロードします)。

これは正常な動作ですか?

List と Flipper をレンダリングするメソッド:

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

}
4

2 に答える 2

2

これはうまく機能します。唯一のことは、ログエントリを追加すると、BindViewメソッドがすべてのアイテムに対して8秒ごとに継続的に呼び出されていることに気付くということです。

bindViewのすべてのアイテムに対して呼び出されるのではないかと思いますListView。おそらく、表示されているアイテムに対してメソッドが呼び出されます(さらにいくつかの追加の呼び出し)。

子をめくると、ViewFillperAndroidは現在の画面コンテンツを再レイアウトする必要があります。これが、bindViewメソッドがViewFlipperの切り替え間隔で呼び出される原因である可能性があります。それはあなたにとって重要ではないはずです。

于 2012-07-16T10:51:14.427 に答える
0

Luksprog が説明したように、これは正常な動作です。メソッド bindView は、行を表示する必要があるたびに毎回呼び出されます。パフォーマンスを気にしている場合 (リストと幅広いオーディエンスの場合は、多くの場合そうなるはずです)、各フリップでリストの内容 (行) を変更しない場合は、必要に応じて、キャッシュなどnewViewの代わりにオーバーライドを検討することをお勧めします。 bindView.

于 2014-12-09T15:00:47.110 に答える