0

他のすべての簡単な質問を調べましたが、探していた答えが見つかりませんでした。ListView があり、各リスト項目にはトグル ボタンが含まれています。2 つの質問があります。

  • リストをスクロールしているときにリスト項目の 1 つのトグル ボタンが押されると、項目が再利用されます。最初の項目をクリックしたとします (一度に表示される項目は 3 つだけです)。4 つのセルごとにトグル ボタンがオンになっています。

  • これはトグル ボタンであるため、ボタンのインスタンスを 1 つだけオンにしたいので、単一のリスト アイテムをオンにした場合、ToggleButton がオンになっている可能性のある ListView 内の他のすべてのアイテムをオフにする必要があります。

どんな助けでも大歓迎です。私のアダプターコードは次のようになります。

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);

    }
4

1 に答える 1

0

これを理解するのに約10時間苦労しました。まだ解決策が見つからない場合は、非常に遅い返信で書いています

リストビューは基本的に、スクロールに基づいてアイテムを再描画し、画面上で表示できるように、非常に思慮深くアイテムを表示する非常に奇妙な(かなり巧妙な)方法で機能します。つまり、現在のビューが対応しなければならないものに基づいて、アイテムを動的に作成します。これは置いといて、解決策を教えてほしい!右?そこに来る

アダプターの getView() メソッドで、checked state をその項目の適切な値に設定するだけです。(または) ImageView を使用している場合は、オンまたはオフに基づいて適切な画像リソースを設定するだけです。

  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);
           }
        }
于 2015-09-09T12:54:29.107 に答える