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 中的位置设置进度条的可见性。使用 AdapterView.OnItemClickListener 而不是 View.OnClickListener。使用数组跟踪进度条的可见性。

    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 回答