他のすべての簡単な質問を調べましたが、探していた答えが見つかりませんでした。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);
}