2016-06-07 5 views
0

첫 번째 단추를 클릭하면 한 단추 만 클릭하면 단추 배경이 잘 설정됩니다. 그러나 아래로 스크롤 할 때 문제는 더 많은 버튼이 그림과 같이 무작위로 바뀌 었음을 발견했습니다.안드로이드 : 목록보기 단추 텍스트 변경

그림 here을 참조하십시오. 코드의

부분 : - ContactSug_Adapter

public class ContactSug_Adapter extends ArrayAdapter { 

    List list = new ArrayList(); 
    ImageLoader imgLoader = new ImageLoader(getContext()); 
    private Context context; 
    public ContactSug_Adapter(Context context, int resource) { 
     super(context, resource); 
    } 

    @Override 
    public void add(Object object) { 
     super.add(object); 
     list.add(object); 
    } 

    @Override 
    public int getCount() { 
     return super.getCount(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return this.list.get(position); 
    } 


    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     View row; 
     row = convertView; 
     final ContactHolder contactHolder; 
     if (row == null) { 
      LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.row, parent, false); 
      contactHolder = new ContactHolder(); 
      contactHolder.tx_id = (TextView) row.findViewById(R.id.usersName2); 
      contactHolder.tx_name = (TextView) row.findViewById(R.id.usersName); 
      contactHolder.sug_add = (Button) row.findViewById(R.id.sug_id); 

      row.setTag(contactHolder); 


     } else { 
      contactHolder = (ContactHolder) row.getTag(); 

     } 
     final Contacts_Sug contacts = (Contacts_Sug) this.getItem(position); 
     contactHolder.image_tx.setImageResource(R.mipmap.ic_launcher); 
     contactHolder.tx_id.setText(contacts.getId()); 
     contactHolder.tx_name.setText(contacts.getName()); 
     contactHolder.sug_add.setTag(position); 

     contactHolder.sug_add.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       contactHolder.sug_add.setText("Selected"); 

      } 
     }); 


     return row; 
    } 


    public class ContactHolder { 
     TextView tx_id, tx_name,loadId; 
     ImageView image_tx; 
     public Button sug_add; 

    }/********* act 
+0

의 ListView가 아래로 스크롤 할 때 재사용되는 때문에'row'가 null되지 않습니다 그래서 때로는 자신의 견해를 재활용합니다. 이 경우'contactHolder = (ContactHolder) row.getTag(); '를 사용하여 이전 뷰에서'contactHolder'를 재사용하고 있습니다. 'position' 매개 변수를 사용하여 상태를 추적합니다 – TychoTheTaco

답변

1

이 뷰의 재활용 때문이다. 원하는 항목에 대해 "선택됨"텍스트를 설정하고 다른 항목에 대한 기본 텍스트를 설정해야합니다. if-else 문을 사용하여이를 수행 할 수 있습니다. 이 같은 selectionPos 개최 Contacts_Sug에 멤버 변수를 가질 필요가 들어

-

contactHolder.sug_add.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       contacts.setSelectedPosition(position); //Set position here 
       contactHolder.sug_add.setText("Selected"); 

      } 
     }); 

그리고 당신은이 onClick() 외부 -

private int selectionPos; 

public void setSelectedPosition(int position){ 
    selectionPos = position; 
} 

public int getSelectedPosition(){ 
    return selectionPos; 
} 

을 그리고 버튼에서 설정 onClick() 보기에 대한 값을 설정하십시오. 이 추가 -

if(contacts.getSelectedPosition() == position){ 
     //Set your button state to "selected" here 
     contactHolder.sug_add.setText("Selected"); 
} else{ 
     //Set your button state to default here 
     contactHolder.sug_add.setText("Follow"); 
}