ListView и ToggleButton

Я посмотрел на все другие простые вопросы, но не смог найти ответ, который искал. У меня есть ListView, и каждый элемент списка содержит кнопку переключения. У меня есть два вопроса:

  • Когда при прокрутке списка нажимается кнопка переключения на одном из элементов списка, элементы перерабатываются; скажем, я щелкнул первый элемент (а одновременно отображается только три) в каждой четвертой ячейке включена кнопка переключения

  • Поскольку это переключатель, я хочу, чтобы был включен только один экземпляр кнопки, поэтому, если она включена в один элемент списка, все остальные элементы в ListView, для которых может быть включена функция ToggleButton, должны быть отключены.

Любая помощь будет оценена. Мой код адаптера выглядит так:

public class RSSFeedItemListAdapter extends ArrayAdapter<RSSItem> {

    private Context context;
    private List<RSSItem> items;
    private int resource;
    private Podcast podcast;
    private boolean[] playpauseState;

    public RSSFeedItemListAdapter(Context context, int resource, List<RSSItem> items, Podcast podcast) {
        super(context, resource, items);
        this.items = items;
        this.context = context;
        this.resource = resource;
        this.podcast = podcast;
        playpauseState = new boolean[this.items.size()];
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Viewholder vh;
        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(resource, parent, false);

            Typeface custom_font = Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensed-Bold.ttf");
            vh = new Viewholder();
            vh.title = (TextView) convertView.findViewById(R.id.podcast_feeditem_title);
            vh.title.setTypeface(custom_font);
            vh.desc = (TextView) convertView.findViewById(R.id.podcast_feeditem_description);
            vh.image = (ImageView) convertView.findViewById(R.id.podcast_feeditem_image);
            vh.pubDate = (TextView) convertView.findViewById(R.id.podcast_feeditem_pubdate);
            vh.collectionName = (TextView) convertView.findViewById(R.id.podcast_feeditem_collection_name);
            vh.playpause = (ToggleButton) convertView.findViewById(R.id.podcast_feeditem_play_pause_cta);
            vh.playpause.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int position = (Integer) buttonView.getTag();
                    playpauseState[position] = isChecked;
                }
            });
            convertView.setTag(vh);
        } else {
            vh = (Viewholder) convertView.getTag();
        }

        vh.playpause.setChecked(playpauseState[position]);
        vh.playpause.setTag(position);


        RSSItem rssItem = items.get(position);
        vh.title.setText(rssItem.getTitle());
        vh.desc.setText(Jsoup.parse(rssItem.getDescription()).text());
        Picasso.with(context).load(podcast.getArtworkExtraLarge()).into(vh.image);

        // TODO detect the local and show the right format
        // TODO the date format should match the date format from the rssfeedhandler code
        if (rssItem.getPubDate() != null) {
            vh.pubDate.setText(vh.simpleDateFormat.format(rssItem.getPubDate()));
        }

        // vh.playpause.setChecked(playpauseState[position]);
        vh.collectionName.setText(podcast.getCollectionName());
        return convertView;
    }


    /**
     *
     */
    static class Viewholder {
        ImageView image;
        TextView title;
        TextView desc;
        TextView pubDate;
        TextView collectionName;
        ToggleButton playpause;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("d MMM", Locale.UK);

    }

1 ответ

Я пытался около 10 часов, чтобы понять это. Если вы все еще не нашли решение, я пишу очень поздний ответ

Представление в виде списка в основном работает по очень странному (довольно умному) способу очень продуманного отображения элементов, который перерисовывает элементы на основе прокрутки и которые можно просматривать на экране. Это означает, что он создает элементы динамически, основываясь на том, что должен учитывать текущий вид. Оставляя это в стороне, хотите сказать мне решение! Правильно? приходить туда

В методе getView() вашего адаптера просто установите в проверенном состоянии соответствующее значение для этого элемента. (или) если вы используете ImageView, просто установите соответствующий ресурс изображения на основе ON или OFF, т.е.

  public View getView(int position, View convertView, ViewGroup parent) {
           ImageView toggle = (ImageView) convertView.findViewById(R.id.toggle);
           if(toggle_array(postion) == 1)
               toggle.setImageResource(R.drawable.on);
           } else {
               toggle.setImageResource(R.drawable.off);
           }
        }
Другие вопросы по тегам