2014-11-20 1 views
0

다른 모든 간단한 질문을 살펴 보았지만 찾고 있던 대답을 찾을 수 없습니다. ListView가 있고 각 목록 항목에 토글 단추가 있습니다. 두 가지 질문이 있습니다.ListView 및 ToggleButton

  • 목록을 스크롤 할 때 목록 항목 중 하나의 토글 단추를 누르면 항목이 재활용됩니다. 첫 번째 항목을 클릭했다 (한 번에 3 개만 표시됨). 네 번째 셀마다 전환 버튼이 켜져 있음

  • 전환 버튼이기 때문에 하나의 버튼 인스턴스 만 켜기를 원합니다. , 단일 목록 항목이 켜져있는 경우 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); 

    } 
+0

귀하의 코드가 먼저 눈에 확인 외모에 내놓고 또는 설정, 나는이 문제를 볼 수 없습니다. 버튼의 태그를 통해 전달하는 동안 getView() 매개 변수에서 'position'변수를 사용하는 것을 선호하지만 vh.playpause.setTag (Integer.valueOf (position))로 변경합니다. int가 기본적으로 Integer로 변환되었는지 또는 int 인수가있는 setTag 메서드가 있는지 확실하지 않습니다. 난 IDE에서 코드를 디버깅하는 것이 좋습니다 – Mixaz

+0

내가 생각하는 설정 togglebutton 체크 안드로이드에 대한 버그입니다. 모든 것을 사실로 설정해보십시오. 해결 방법은 이미지 뷰를 사용하고 확인 된 상태에 대해 다른 이미지를 설정하는 것입니다. – MD1948

+0

문제는 여전히 작동하지 않는다는 것입니다. 나는 둘 다 시도했다. – RnP

답변

0

나는 이것을 알아 내기 위해 약 10 시간 정도 힘들었습니다. 아직 해결책을 찾지 못했다면 매우 늦은 답장을 보내고 있습니다.

목록보기는 기본적으로 스크롤을 기반으로 항목을 다시 그려내는 항목을 매우 신중하게 표시하는 방식으로 진행됩니다 화면에서 볼 수 있습니다. 즉, 현재보기가 수용해야하는 항목을 기반으로 항목을 동적으로 생성합니다. 이 부분을 남겨두고 해결책을 말해주고 싶습니다! 권리? come here

어댑터 getView() 메소드에서 checked 상태를 해당 항목에 적절한 값으로 설정하기 만하면됩니다. (또는) 당신이 이미지 뷰를 사용하는 경우, 단지 해당 이미지 리소스 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); 
      } 
     }