【问题标题】:Android: Custom list adapter with progress barAndroid:带有进度条的自定义列表适配器
【发布时间】:2012-11-30 15:05:35
【问题描述】:

我有一个自定义列表适配器,我正在尝试使用其中包含进度条的布局。

我的问题是,当视图第一次膨胀时,我将进度条的可见性设置为 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;
}

这基本上是概念验证代码.. 所以它不是很漂亮。但是,只是想把这个想法记下来,以便我可以正确使用它。

【问题讨论】:

  • due to the recycling of the view? 是的!您需要跟踪可见/不可见的项目,然后在getView 中更新它
  • 检查 stackoverflow.com/questions/6649077/…>.

标签: android listadapter


【解决方案1】:

你是对的。由于视图可以回收并用作另一个位置的项目,因此您应该始终根据 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);
        }
    }

【讨论】:

  • _list 在哪里填充?
猜你喜欢
  • 2018-04-04
  • 2013-10-07
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2015-07-20
  • 2011-02-14
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多