android:如何在listview中使用viewflipper一次动画一行

问题描述 投票:0回答:1

我有一个带有自定义适配器的列表视图。列表视图的每一行包含两个textview和一个viewflipper。

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

我的按钮点击代码如下。

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

}

我所需要的只是一次动画一行。但现在所有行都是同时动画。任何见解或输入都会非常有用。

android listview baseadapter viewflipper
1个回答
1
投票

试试这个:

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

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.