2011-12-07 7 views
0

ListViewの項目の中で時々ビューをアニメーション化しようとしています。これはカスタムビューで、RelativeLayoutに拡張されています。その目的は、インターネットを含むいくつかのソースから時折情報を取得して表示することです。 新しい情報が利用可能になるたびに、新しい子ビューがプログラムによって作成されます。古いビューはカスタムビュー(RelativeLayout)からアニメーション化され、新しいビューはアニメーション化され、ViewFlipperが機能します。 このビューは通常のレイアウトに配置したときに正常に動作しますが、ListViewのアイテムに配置するときに問題があります。問題は、それがリストから1〜2回スクロールした後に再描画を停止するということです。スクリーンから出て再び戻ってくる直後です。アニメーションはもう表示されず、カスタムビューはリストとやり取りするときにのみ描画されます。 私はビューを無効にして、リストやその他のオプションを無効にしようとしましたが、これはうまくいきません...ListView内のアニメーション

何か助けていただければ幸いです。ありがとう。

私のカスタムビューで試した正確なメカニズムに似たいくつかのコードがあります(ここでは私のビューで何か問題がないかどうかを確認するためにViewFlipperを使用しています。 )

package com.test.viewflipper; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewGroup.LayoutParams; 
import android.view.animation.Animation; 
import android.view.animation.TranslateAnimation; 
import android.widget.AbsListView; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.ViewFlipper; 

public class ViewFlipperTestActivity extends ListActivity { 
    /** Called when the activity is first created. */ 

    private ViewFlipper viewFlipper; 
    private Animation TRANSLATE_LEFT_TO_RIGHT_VIEW_IN = new TranslateAnimation(Animation.RELATIVE_TO_SELF, -1.0f, 
     Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f); 
    private Animation TRANSLATE_LEFT_TO_RIGHT_VIEW_OUT = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, 
     Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    viewFlipper = new ViewFlipper(this); 
    LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    viewFlipper.setLayoutParams(new AbsListView.LayoutParams(params)); 
    viewFlipper.setInAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_IN); 
    viewFlipper.setOutAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_OUT); 
    for (int i = 0; i < 10; i++) { 
     Button button = new Button(getApplicationContext()); 
     button.setText("Button " + i); 
     viewFlipper.addView(button); 
    } 
    viewFlipper.setFlipInterval(1000); 
    viewFlipper.setAutoStart(true); 
    viewFlipper.startFlipping(); 

    LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    setListAdapter(new AdListAdapter(layoutInflater)); 
    } 

    private class AdListAdapter extends BaseAdapter { 

    private LayoutInflater layoutInflater; 

    public AdListAdapter(LayoutInflater layoutInflater) { 
     this.layoutInflater = layoutInflater; 
    } 

    @Override 
    public int getCount() { 
     return 10; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     /* return the ad container for the first position */ 
     if (position == 0) { 
     return viewFlipper; 
     } 
     else { 
     View view = layoutInflater.inflate(android.R.layout.simple_list_item_1, null); 
     TextView textView = (TextView) view.findViewById(android.R.id.text1); 
     textView.setText("Item " + position); 
     return view; 
     } 
    } 
    } 
} 

答えて

0

カスタムビューの場合、手動でアニメーションを開始しようとしましたか?プログラムでまたはxmlでアニメーションを作成し、次にview.startAnimation(animation)を使用します。

また、コードを表示できますか?


アップデート:すべての最初の、

[OK]を、アニメーションは毎秒を開始します。

private class AdListAdapter extends ArrayAdapter<String> { 

private ViewFlipper viewFlipper; 
private LayoutInflater layoutInflater; 

public AdListAdapter(Context context) { 
    super(context, android.R.layout.simple_list_item_1, android.R.id.text1); 
    // NOTE: This should be done with an xml 
    viewFlipper = new ViewFlipper(context); 
    LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    viewFlipper.setLayoutParams(new AbsListView.LayoutParams(params)); 
    viewFlipper.setInAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_IN); 
    viewFlipper.setOutAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_OUT); 
    viewFlipper.setFlipInterval(1000); 
    for (int i = 0; i < 10; i++) { 
    Button button = new Button(getApplicationContext()); 
    button.setText("Button " + i); 
    viewFlipper.addView(button); 
    // add an item to the adapter 
    add("Item " + i); 
    } 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (position == 0) { 
    // check if it's flipping 
    if(!viewFlipper.isFlipping()) { 
     viewFlipper.startFlipping(); 
    } 
    return viewFlipper; 
    } else if(convertView == viewFlipper) { 
    // makes sure that the flipping is stopped when the viewFlipper is reused 
    if(viewFlipper.isFlipping()) { 
     viewFlipper.stopFlipping(); 
    } 
    convertView = null; 
    } 
    return super.getView(position, convertView, parent); 
} 
} 

してから使用して作成します:しかし、私は活動から viewFlipperを削除し、これにカスタムアダプタを書き換える推薦

setListAdapter(new AdListAdapter(this)); 

私はそれをテストしていませんが、それはこの仕事がありコードの簡略化とビューの再利用(Androidの小さな重要な特徴)

+0

まあアニメーションは10秒ごとに手動で開始されます。問題は、リストに表示されているアイテムを取り出して再び戻った後で、ビューが再描画されないことです。私は私のアプリにログを入れ、アニメーションプロセスが起動されます。ただし、UIでは更新されません(再描画されません)。 – Daniel

+0

私の質問にいくつかのコードを追加しました。 – Daniel

+0

可能な解決策で回答を更新しました。現時点ではテストされていませんが、動作すれば教えてください;) – pablisco