Android自定义适配器 - 错误项目上的动画

时间:2016-05-11 17:51:31

标签: android listview android-arrayadapter

当我遇到此问题时,我正在使用自定义适配器在Android中进行试验:我的MainActivity包含ListView,每行TextViewImageViewImageView只显示一种颜色。我的ListView模型包含名称String和密钥int。 我的Adapter应为ImageView为每个数字(键)设置不同的背景颜色。如果key为4,则ImageView应闪烁。 如果我运行我的代码,List中的第一个元素也会闪烁,但键不是4。 希望任何人都能解释我的错误。

public class myAdapter extends ArrayAdapter<Test>{

    private ArrayList<Test> liste;

    public myAdapter(Context context, int resource, ArrayList<Test> items) {
        super(context, resource, items);
        liste = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            convertView = inflater.inflate(R.layout.list_view_item_main, parent, false);
        }

        Test t = getItem(position);
        TextView tv = (TextView) convertView.findViewById(R.id.lvName);
        ImageView iv = (ImageView) convertView.findViewById(R.id.lvStatus);

        int k = t.getKey();
        tv.setText(t.getName());

        if (k == 1) {
            iv.setBackgroundColor(Color.rgb(102, 255, 51));
        }

        if (k == 2) {
            iv.setBackgroundColor(Color.rgb(255, 204, 51));
        }

        if (k == 3) {
           iv.setBackgroundColor(Color.rgb(245, 61, 0));
        }

        if (k == 4) {
            iv.setBackgroundColor(Color.rgb(245, 61, 0));
            final Animation animation = new AlphaAnimation(1, 0);
           animation.setDuration(1000);
            animation.setInterpolator(new LinearInterpolator());
            animation.setRepeatCount(Animation.INFINITE);
            animation.setRepeatMode(Animation.REVERSE);
            iv.startAnimation(animation);
        }


        return convertView;


    }

}

public class Test {

    private String name;
    private int key;


    public Test(String name, int key) {
        this.name = name;
        this.key = key;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getKey() {
        return key;
    }

    public void setKey(int key) {
        this.key = key;
    }
}


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<Test> liste = new ArrayList<>();
        liste.add(new Test("Milch", 1));
        liste.add(new Test("Käse", 2));
        liste.add(new Test("Schokolade", 3));
        liste.add(new Test("Capri Sonne", 4));

        ListView lv = (ListView) findViewById(R.id.lvShowFridge);
        myAdapter mya = new myAdapter(this, R.layout.list_view_item_main, liste);
        lv.setAdapter(mya);
    }   

}

1 个答案:

答案 0 :(得分:3)

请记住,项目的视图会被重复使用(如果convertView在传递给getView(...)时不为空)。曾经用于显示item1的一个特定视图可以传递到getView(...)以显示,例如,item4。这意味着您在item1调用中设置的所有属性仍然有效 - 包括背景和动画。

这有什么影响?嗯...:

1 - 如果您没有专门设置背景,它将保留前一个(在您的情况下,正如您所说,如果您在k == 1时取出设置背景,它将保留以前设置的颜色,恰好是k == 4)

的那个

2 - 当你被调用k == 4时,你正在开始动画,但如果视图被重用于任何其他颜色/索引,你就不会停止它。适当地添加对iv.clearAnimation()的调用(对于您不需要动画的情况)。