1

プログレスバーを含むレイアウトを使用しようとしているカスタムリストアダプターがあります。

私の問題は、ビューが最初に膨らんだときに、進行状況バーの可視性を false に設定したことです。アイテムがクリックされると、プログレス バーの可視性を true に設定します。しかし、リストを下にスクロールすると、ランダムなアイテムの進行状況バーが表示されます (ビューのリサイクルのため?)。

これを改善する簡単な方法はありますか?

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

    ViewHolder holder = null;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.imagegriditem, null);

        holder = new ViewHolder();
        holder.heroName = (TextView) convertView.findViewById(R.id.heroName);
        holder.heroImage = (ImageView)convertView.findViewById(R.id.heroImage);
        holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progressBar);
        holder.progressBar.setIndeterminate(false);
        holder.progressBar.setVisibility(View.INVISIBLE);
        holder.progressBar.setIndeterminate(false);
        holder.progressVisible = View.INVISIBLE;
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }

    if(holder != null){
        holder.heroName.setText(heroes[position]);
        holder.heroImage.setImageResource(android.R.drawable.ic_dialog_email);
        holder.progressBar.setProgress(10);
    }

    final int pos = position;

    final ViewHolder hold = holder;

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            hold.progressBar.setProgress(hold.progressBar.getProgress() + 10);
            hold.progressVisible = View.VISIBLE;
            hold.progressBar.setVisibility(View.VISIBLE);
        }
    });

    return convertView;
}

これは基本的に概念コードの証明です..だから、きれいではありません。しかし、それを適切に使用できるように、アイデアを取り込もうとしています。

4

1 に答える 1

0

あなたが正しい。ビューはリサイクルして別の位置のアイテムとして使用できるため、getViewの位置に基づいてプログレスバーの可視性を常に設定する必要があります。View.OnClickListenerの代わりにAdapterView.OnItemClickListenerを使用します。配列を使用して、プログレスバーの可視性を追跡します。

    public class AdapterItem
    {
        public Boolean IsInProgress;
    }

...    
    Public class CustomAdapter extends BaseAdapter
    {

        ArrayList<AdapterItem> _list = new ArrayList<AdapterItem>()
        ...

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

           if (holder != null && _list.size() > position)
           {
                AdapterItem item = _list.get(position);

            holder.progressVisible = Item.IsInProgress ? View. VISIBLE : View.INVISIBLE
           }
        }

        public void onItemClick(int position)
        {
            AdapterItem item = _list.get(position);
            item.IsInProgress = !item.IsInProgress;
        }
    }

    ...

    listView.setOnItemClickListener(new OnItemClickListener() 
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

            CustomAdapter adpt = (CustomAdapter)parent.getAdapter();
            adpt.onItemClick(position);
        }
    }
于 2012-11-30T07:05:35.313 に答える