android:how 在列表视图中使用 viewflipper 一次为一行设置动画

android:how to use viewflipper in listview to animate one row at a time

我有一个带有自定义 adapter.Each 行的列表视图,该列表视图包含两个文本视图和一个 viewflipper。

当我单击一个按钮时,我想 animate/flip 每行随机显示一个文本。 对于动画,我使用了视图翻转器,但动画不是一个接一个地工作,而是同时对所有行工作。

我的按钮点击代码如下

public void onButtonClick(View view) {
        customAdapter.setFlipRow(!(customAdapter.isFlipRow()));
        listView.invalidateViews();
    }

自定义适配器:

public class CustomAdapter extends BaseAdapter {
Context context;
String countryList[];
boolean flag[]= null;
int flags[];
LayoutInflater inflter;

Random r = null;
private static String TAG = "CustomAdapter";

public ViewHolder getViewHolder() {
    return viewHolder;
}

ViewHolder viewHolder;

public boolean isFlipRow() {
    return flipRow;
}

public void setFlipRow(boolean flipRow) {
    this.flipRow = flipRow;
}

private boolean flipRow = false;

public CustomAdapter(Context applicationContext, String[] countryList) {
    this.context = context;
    this.countryList = countryList;
    flag = new boolean[countryList.length];

    for(int f = 0;f<flag.length;f++)
    {
        flag[f] = false;
    }
    inflter = (LayoutInflater.from(applicationContext));
    r = new Random(5);
}

private static class ViewHolder {
    TextView country;
    TextView country1;
    ViewFlipper viewFlipper;
    ListView lv;
}


@Override
public View getView(int pos, View view, ViewGroup viewGroup) {

    View v = view;

    if(view == null)
    {
        viewHolder = new ViewHolder();
        view = inflter.inflate(R.layout.listadapter, null);
        viewHolder.country = (TextView) view.findViewById(R.id.textView);
        viewHolder.country1 = (TextView) view.findViewById(R.id.bottomtextView);
        viewHolder.viewFlipper = (ViewFlipper) view.findViewById(R.id.flipper);
        viewHolder.lv = (ListView)view.findViewById(R.id.listView);
        view.setTag(viewHolder);
    }else {
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.country.setText(countryList[pos]);

    int rInt = r.nextInt(5);

    if(isFlipRow()){
        viewHolder.country1.setText("Random No: "+rInt);
        viewHolder.viewFlipper.setFlipInterval(1000);

         if(pos <= countryList.length-1)
        {
            flag[pos] = true;

            if(pos == 0 && flag[pos]){
                viewHolder.viewFlipper.startFlipping();

            }


            if(pos != 0 && flag[pos-1] == true){
                viewHolder.viewFlipper.startFlipping();
                flag[pos-1] = false;
                /*viewHolder.viewFlipper.stopFlipping();
                I tried to have a boolean flag for each row,
             setting it before startFlipping() and resetting it after 
             stopFlipping().But adding this stopFlipping() here
             stops all rows except first row and all rows flip at the 
             same time.Moreover getView is called only during setAdapter()
             and invalidateviews().*/
            }

            if(pos == countryList.length-1){
                Arrays.fill(flag,false);
            }

        }
    }
    else{
        viewHolder.viewFlipper.stopFlipping();
        Arrays.fill(flag,false);
    }

    return view;
}

}

我只需要在 time.But 为每一行制作动画,现在所有行都以相同的方式制作动画 time.Any 见解或输入将非常有帮助。

试试这个:

public void onButtonClick(View view) {
    customAdapter.flipRow(view);
}

和适配器:

public class CustomAdapter extends BaseAdapter {
Context context;
String countryList[];
int rnds[];
LayoutInflater inflater;
Random r;
private boolean flipRow = false;
private int flipRowNum = 0;
Button btn;

final private static String TAG = "CustomAdapter";
final private static int FLIP_DELAY = 1000;
final private static int FLIP_COUNT = 2;

public boolean isFlipRow() {
    return flipRow;
}

public void flipRow(View view) {
    btn = (Button)view;
    btn.setEnabled(false);
    flipRow = true;
    notifyDataSetChanged();
}

public CustomAdapter(Context context, String[] countryList) {
    this.context = context;
    this.countryList = countryList;
    inflater = (LayoutInflater.from(context));

    r = new Random(5);
    rnds = new int[countryList.length];
    for(int f = 0;f<rnds.length; f++)
    {
        rnds[f] = r.nextInt(5);
    }
}

private class ViewHolder {
    TextView country;
    TextView country1;
    ViewFlipper viewFlipper;
    ListView lv;
}

@Override
public int getCount() {
    return countryList.length;
}

@Override
public String getItem(int i) {
    return countryList[i];
}

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

@Override
public View getView(int pos, View view, ViewGroup viewGroup) {
    final ViewHolder viewHolder;
    if(view == null)
    {
        viewHolder = new ViewHolder();
        view = inflater.inflate(R.layout.listadapter, null);
        viewHolder.country = (TextView) view.findViewById(R.id.textView);
        viewHolder.country1 = (TextView) view.findViewById(R.id.bottomtextView);
        viewHolder.viewFlipper = (ViewFlipper) view.findViewById(R.id.flipper);
        //viewHolder.lv = (ListView)view.findViewById(R.id.listView);
        view.setTag(viewHolder);
    }else {
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.country.setText(countryList[pos]);
    viewHolder.country1.setText("Random No: " + rnds[pos]);
    viewHolder.viewFlipper.setFlipInterval(0);

    if(isFlipRow() && (pos == flipRowNum)){
        viewHolder.viewFlipper.startFlipping();
        viewHolder.viewFlipper.setFlipInterval(FLIP_DELAY);
        viewHolder.viewFlipper.postDelayed(new Runnable() { //Stop flipping
            @Override
            public void run() {
                viewHolder.viewFlipper.stopFlipping();
                flipRow = !flipRow;
                flipRowNum++;
                if(flipRowNum == countryList.length) flipRowNum = 0;
                btn.setEnabled(true);
            }
        }, (2*FLIP_COUNT - 1)*FLIP_DELAY + 50);
    }
    return view;
}
}

希望对您有所帮助!