1

この問題を探しましたが、私の状況に一致するものは見つかりませんでした。

私の問題は、Android 2.3.x で発生します (4.x では完全に動作します)。

カスタム リスト ビューを持つアプリケーションがあります。次のようにリストビューを初期化します

ListAdapter mListAdapter = new ListAdapter(getApplicationContext(), this, ...);
lvSelector = (ListView) findViewById(R.id.listView1);
lvSelector.setAdapter(mListAdapter);

私の ListAdapter は次のとおりです。

public class ListAdapter extends BaseAdapter {
    static class Holder {
    LinearLayout layoutRoot, layoutColor;
    TextView  hText;
    Animation anim = AnimationUtils.loadAnimation(mActivity, R.anim.anim_list_item);

    public Holder() {
        layoutRoot = new LinearLayout(mContext);
        layoutColor = new LinearLayout(mContext);
        hText = new TextView(mContext);
    }

    public Holder(Holder holder) {
        this.layoutRoot = holder.layoutRoot;
        this.layoutColor = holder.layoutColor;
        this.hText = holder.hText;
    }
}

    int mSwap1, mSwap2;

    Animation mAnimation;

    public ListAdapter(Context _context, Activity _activity, FileHandler _fileHandler, String _strSchemaName, List<String> _list, List<String> _solution) {
        mContext = _context;
        mActivity = _activity;

        mAnimation = AnimationUtils.loadAnimation(mActivity, R.anim.anim_list_item);
        mAnimation.reset();

        mSwap1 = mSwap2 = -1;

        /* ... */

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final int fPosition = position;

    View row = convertView;
    Holder lHolder = null;

    if (row==null) {
                LayoutInflater inflater = mActivity.getLayoutInflater();
                row = inflater.inflate(R.layout.layout_schema_element, parent, false);

                lHolder = new Holder();
                lHolder.layoutRoot = (LinearLayout) row.findViewById(R.id.elementLayoutRoot);
                lHolder.layoutColor = (LinearLayout) row.findViewById(R.id.elementLayoutColor);
                lHolder.hText = (TextView) row.findViewById(R.id.textViewWord);

                row.setTag(lHolder);
            }
            else {
                lHolder = (Holder)row.getTag();
            }

            row.setOnClickListener(null);

            if (position==0 || position==mDataList.size()-1) {
                lHolder.layoutColor.setBackgroundResource(R.drawable.bg_elem_fixed);
                lHolder.layoutColor.setOnClickListener(null);
            }
            else {
                lHolder.layoutColor.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        moveElement(fPosition);
                    }
                });

    }

    lHolder.hText.setText(mDataList.get(position));
    lHolder.layoutRoot.setBackgroundResource(0);

    mHolder.set(position, lHolder);

    return row;
    }
}

protected void moveElement(int _element) {
    if (mDataList.get(_element).equals(mSolution.get(_element)))
        return;

    if (mSwap1==-1)
    {
        System.out.println("setting swap1=" + _element);
        mHolder.get(_element).layoutRoot.setBackgroundResource(R.drawable.bg_elem_selected_lite);
        mSwap1 = _element;
    }
    else
    {
        if (mSwap2==-1)
        {
            System.out.println("setting swap2=" + _element);

            mHolder.get(_element).layoutRoot.setBackgroundResource(R.drawable.bg_elem_selected_lite);
            mSwap2 = _element;
        }
    }

            if (mSwap1!=-1)
    {
        System.out.println("running animation on mSwap1=" + mSwap1);
        mHolder.get(mSwap1).layoutRoot.clearAnimation();
        mHolder.get(mSwap1).layoutRoot.startAnimation(mAnimation);
    }

    /***** THIS IS WHAT DOES NOT WORK *****/
            if (mSwap2!=-1)
    {
        System.out.println("running animation on mSwap2=" + mSwap2);
        mHolder.get(mSwap2).layoutRoot.clearAnimation();
        mHolder.get(mSwap2).layoutRoot.startAnimation(mAnimation);
    }


    if (mSwap1!=-1 && mSwap2!=-1)
    {
        mHolder.get(mSwap1).layoutRoot.setBackgroundColor(0);
        mHolder.get(mSwap2).layoutRoot.setBackgroundColor(0);

        if (mSwap1==mSwap2)
        {
            mSwap1 = mSwap2 = -1;
            return;
        }

        Collections.swap(mDataList, mSwap1, mSwap2);
        Collections.swap(mHolder, mSwap1, mSwap2);
        Collections.swap(dataObjs, mSwap1, mSwap2);

        mSwap1 = mSwap2 = -1;

        notifyDataSetChanged();
    }
}

}

Collections.swap(list, mSwap1, mSwap2)を実行すると、すべてが正常に機能し、要素が正しくスワップされます。

最初のアニメーション (mSwap1) は正常に実行されます。私の問題は、2 番目のアニメーションが実行されると (mSwap2)、mSwap2 が正しい場合でも画面内の別の要素で実行されることです (例: mSwap1=1 -> リスト内の 2 番目の要素がアニメーション化され、mSwap2=2 -> n-1 要素)リスト内の n-2 要素がアニメーション化されます。ここで、n は表示される要素の数です)。

4

1 に答える 1