1

以下に示すコードで奇妙な動作が発生しています。私の各行にボタンがあり、クリックされたListView場合、行をグレー表示してボタンを非表示にしたいと考えています。変更を永続的にするために、カスタムにプロパティを設定してViewHolder、変更が永続的になるようにしました。

ただし、アイテム 1 のボタンをクリックすると、アイテム 6 にも変更が適用されます。他のアイテムでは、他の行に影響しないか、複数の行に影響します。いくつかの変数を宣言することと関係があると思われfinalますが、確信が持てません。私はさまざまな解決策を実装しようとしました(最終変数の数を減らす、さまざまな変数を使用するなど)が、実際には何も機能していないようです。

助けが必要です。ありがとうございました!

public class FruitLoopsAdapter extends BaseAdapter
{
    private ArrayList<FruitLoopsNode> provider;
    private Activity parent;
    /**
     * Constructor.
     * @param parent 
     *      The parent activity of the fragment using the FruitLoop. Needed as the adapter will
     *      be used in a fragment which only its parents has access to the data providers. 
     */
    public FruitLoopsAdapter(Activity parent)
    {
        this.parent = parent;
        provider = ((Box)parent).getFruitLoops();
    }

    /**
     * Method returning the size of the underlying data provider.
     * @return
     *      The size of the data provider.
     * @see android.widget.Adapter#getCount()
     */
    @Override
    public int getCount()
    {
            return provider.size();
    }

    /**{@inheritDoc}*/
    @Override
    public Object getItem(int position)
    {
            return provider.get(position);
    }

    /**{@inheritDoc}*/
    @Override
    public long getItemId(int position)
    {
            return position;
    }

    /**
     * Method building the composite custom view and returning it as one view.
     * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parentViewGroup)
    {       
            FruitLoopsViewHolder viewHolder;
            final FruitLoopsNode FruitLoopsNode = provider.get(position);

            if (convertView == null)
            {
                    convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_FruitLoops, null);

                    viewHolder = new FruitLoopsViewHolder(
                                    (TextView) convertView.findViewById(R.id.time),
                                    (Button) convertView.findViewById(R.id.consume),
                                    (ImageView) convertView.findViewById(R.id.thumbnail),
                                    (TextView) convertView.findViewById(R.id.content_title),
                                    (TextView) convertView.findViewById(R.id.content_brief),
                                    (RatingBar) convertView.findViewById(R.id.ratingBar));
                    convertView.setTag(viewHolder);
            } else {
                    viewHolder = (FruitLoopsViewHolder) convertView.getTag();
                    determinePresentationMode(convertView, viewHolder);
            }

            /** [Omitted some code setting many of the fields above to] */

            final Button button = viewHolder.getButton();
            final View finalConvertView = convertView;
            button.setOnClickListener(new OnClickListener()
            {
                    public void onClick(View view)
                    {
                            button.setEnabled(false);
                            button.setVisibility(View.INVISIBLE);
                            finalConvertView.setAlpha(0.5f);
                            finalConvertView.setBackgroundColor(Color.GRAY);
                    }
            });

            /**
             * As using a final viewHolder to set the value inside the onClick() method of the 
             * button will cause the images not to update anymore, investigating the alpha value
             * of the convertView seemed the only easy way to get there. Also, as it is a float, 
             * I want to leave a bit of extra padding in the test.
             */
            if(finalConvertView.getAlpha() < 0.9)
            {
                    viewHolder.setConsumed(true);
            }

    return convertView;
    }

    private void determinePresentationMode(View convertView, FruitLoopsViewHolder viewHolder)
    {
            if(viewHolder.wasConsumed())
            {
                    convertView.setAlpha(0.5f);
                    convertView.setBackgroundColor(Color.GRAY);
            }
    }
}
4

2 に答える 2

2

wasConsumed()が falseの場合は、アルファを初期状態にリセットする必要があると思います。

何かのようなもの:

private void determinePresentationMode(View convertView, FruitLoopsViewHolder viewHolder)
    {
            if(viewHolder.wasConsumed())
            {
                    convertView.setAlpha(0.5f);
                    convertView.setBackgroundColor(Color.GRAY);
            } else {
                    convertView.setAlpha(1f); // A value higher of 0.9
                    convertView.setBackgroundColor(Color.WHITE); // or whatever color
            }
    }

問題は、同じビューを再利用していることですが、アルファは同じになります。状態情報を保持し、にViewHolder基づいて状態を決定しませんconvertView#alpha

于 2013-06-21T08:19:38.523 に答える
0

条件を削除 if (convertView == null)してから getView() で試してください

@Override
    public View getView(int position, View convertView, ViewGroup parentViewGroup)
    {       
            FruitLoopsViewHolder viewHolder;
            final FruitLoopsNode FruitLoopsNode = provider.get(position);


                convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_FruitLoops, null);

                viewHolder = new FruitLoopsViewHolder(
                                (TextView) convertView.findViewById(R.id.time),
                                (Button) convertView.findViewById(R.id.consume),
                                (ImageView) convertView.findViewById(R.id.thumbnail),
                                (TextView) convertView.findViewById(R.id.content_title),
                                (TextView) convertView.findViewById(R.id.content_brief),
                                (RatingBar) convertView.findViewById(R.id.ratingBar));
                convertView.setTag(viewHolder);


        /** [Omitted some code setting many of the fields above to] */

        final Button button = viewHolder.getButton();
        final View finalConvertView = convertView;
        button.setOnClickListener(new OnClickListener()
        {
                public void onClick(View view)
                {
                        button.setEnabled(false);
                        button.setVisibility(View.INVISIBLE);
                        finalConvertView.setAlpha(0.5f);
                        finalConvertView.setBackgroundColor(Color.GRAY);
                }
        });

        /**
         * As using a final viewHolder to set the value inside the onClick() method of the 
         * button will cause the images not to update anymore, investigating the alpha value
         * of the convertView seemed the only easy way to get there. Also, as it is a float, 
         * I want to leave a bit of extra padding in the test.
         */
        if(finalConvertView.getAlpha() < 0.9)
        {
                viewHolder.setConsumed(true);
        }

return convertView;
}
于 2013-06-21T08:11:03.113 に答える