2013-09-26 7 views
0

나는 텍스트와 체크 박스가있는 listview가 있습니다. 목록보기를 스크롤하는 동안 확인란이 이상하게 작동합니다. 그것은 재활용 문제로 보인다. 어쨌든 나는 몇몇 유사한 포스트에서 제안 된 각종 선택권을 시도하고 그러나 저를 위해 일해 그 (것)들의 아무도를 시도하지 않았다. 나는 세트 중 하나를 시도했지만 힘든 행운을 제안했다 태그 위치를 얻을. 내 활동 파일에서 사용자 지정 어댑터를 사용하여 목록보기를 사용 중입니다. 다음은 일부 코드 단편입니다. 활동 클래스 :ListView 스크롤의 체크 박스 문제

lv = (ListView) findViewById(R.id.itemdisplay_listview); 
lv.setAdapter(new CustomAdapter(this, itemNames, tableNo)); 

사용자 정의 어댑터 : 나는 꽤 오랜 시간 동안 고전을 면치 못하고있다

private class CustomAdapter extends BaseAdapter { 

     private List<String> mListItems; 
     private LayoutInflater mLayoutInflater; 
     ViewHolder holder; 
     int a = 1; 

     public CustomAdapter(Context context, List<String> arrayList, 
       String table) { 
      tableNumber = table; 
      mListItems = arrayList; 

      // get the layout inflater 
      mLayoutInflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return mListItems.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public long getItemId(int arg0) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     private class ViewHolder { 

      TextView itemName, quantity; 
      CheckBox checkbox; 
      ImageButton addBtn, minusBtn; 

     } 

     @Override 
     public View getView(int position, View convertview, ViewGroup viewGroup) { 

      // create a ViewHolder reference 

      // check to see if the reused view is null or not, if is not null 
      // then 
      // reuse it 
      if (convertview == null) { 
       holder = new ViewHolder(); 

       convertview = mLayoutInflater.inflate(
         R.layout.itemdisplay_list, null); 

       holder.itemName = (TextView) convertview 
         .findViewById(R.id.itemdisplaylist_name); 
       holder.addBtn = (ImageButton) convertview 
         .findViewById(R.id.itemdisplaylist_add); 
       holder.minusBtn = (ImageButton) convertview 
         .findViewById(R.id.itemdisplaylist_minus); 
       holder.quantity = (TextView) convertview 
         .findViewById(R.id.itemdisplaylist_quantity); 
       holder.checkbox = (CheckBox) convertview 
         .findViewById(R.id.itemdisplaylist_cbox); 

       // holder.checkbox.setTag(position); 


       // the setTag is used to store the data within this view 
       convertview.setTag(holder); 
      } else { 
       // the getTag returns the viewHolder object set as a tag to the 
       // view 
       holder = (ViewHolder) convertview.getTag(); 
      } 

      holder.checkbox.setOnClickListener(checkListener); 
      doneBtn.setEnabled(true); 

      holder.minusBtn.setImageResource(R.drawable.minus); 
      holder.quantity.setText(String.valueOf(a)); 
      holder.addBtn.setImageResource(R.drawable.add); 
      holder.addBtn.setOnClickListener(addBtnClick); 
      holder.minusBtn.setOnClickListener(minusBtnClick); 

      String stringItem = mListItems.get(position); 

      if (stringItem != null) { 
       if (holder.itemName != null) { 
        // set the item name on the TextView 
        holder.itemName.setText(stringItem); 
       } 
      } 

      // this method must return the view corresponding to the data at the 
      // specified position. 
      return convertview; 

     } 

     private OnClickListener checkListener = new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       /*doneBtn.setOnClickListener(doneBtnClick);*/ 
       View view = (View) v.getParent(); 

       CheckBox cb = (CheckBox) view 
         .findViewById(R.id.itemdisplaylist_cbox); 
       TextView tv = (TextView) view 
         .findViewById(R.id.itemdisplaylist_name); 
       TextView tv1 = (TextView) view 
         .findViewById(R.id.itemdisplaylist_quantity); 
       if (cb.isChecked()) { 
        map.put(tv.getText().toString(), tv1.getText().toString()); 
       } else { 
        for (Iterator<Map.Entry<String, String>> it = map 
          .entrySet().iterator(); it.hasNext();) { 

         Map.Entry<String, String> entry = it.next(); 
         String item = entry.getKey(); 
         if ((tv.getText().toString()).equals(item)) { 
          it.remove(); 
         } 
        } 
       } 

      } 
     }; 

. 제발 조언. 감사.

+0

내 대답을 확인해보십시오. – Harshid

답변

0

boolean checkedViewHolder에 추가하십시오. checkListener로 변경하십시오. 그런 다음 getViewholder.checkbox.setChecked(holder.checked)을 추가하십시오.

희망이 있습니다. 대신 전달, 그리고

// Oversimplified, but adiquate for our purposes. 
public class ItemModel 
{ 
    public String text; 
    public boolean isChecked; 
} 

: 당신은 당신의 체크 박스의 상태를 유지 모델 객체의 일종을 가질 필요 해요

+0

감사합니다. 나는 제안했지만 여전히 같은 문제를 시도했다. 지금 다른 옵션을 시도 중입니다. – Gaurav

+0

체크 박스 위치가 포함 된 새로운 arrayList를 만듭니다. 어댑터에 전달하고 어댑터에서 arraylist와 사용자 holder.checkbox.setOncheckChangeListener() {}를 수정하십시오. 이 안에는 arraylist를 수정하는 논리가 있습니다. – newBie

0

는 다음 자료 구조로 간단한 문자열 대신 해당 모델을 사용 어댑터에 대한 문자열 배열은 ItemModels 배열을 전달하십시오. 문자열은 text 매개 변수가 될 것이므로 checkbox 값을 isChecked 값으로 설정해야합니다.

체크 박스 상태가 변경되면 남아있는 모든 것은 isChecked 값을 변경합니다. holder.checkbox 매개 변수를 초기화 한 후 if(convertView == null) 블록 내부의 getItem 메소드 내부에서이를 수행하십시오. 또한 메서드 매개 변수 final에서 position 변수를 변경해야합니다. 이 :) 도움이

0

내 생각 엔 당신이 재활용 문제에 물린지고있다

holder.checkbox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() 
     {   
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
      { 
       mListItems.get(position).isChecked = isChecked; 

      } 
     }); 

희망 :

여기에 코드입니다.

} else { 
       // the getTag returns the viewHolder object set as a tag to the 
       // view 
       holder = (ViewHolder) convertview.getTag(); 
       holder.checkbox.setOnCheckedChangeListener(null); 
      } 
+0

감사합니다. 제안했지만 여전히 같은 문제로 노력했다. – Gaurav

1

당신이 100 사채에 대한 데이터를 말할 경우 당신에게 다음 :
나는 다음과 같이 먼저 사용 else 문 코드에서

holder.checkbox.setOnCheckedChangeListener(null); 

에 다음을 리스너를 제거하는 것이 좋습니다 또한 checked/unchecked state을 저장해야합니다. 100 요소의 부울 배열을 말할 수 있습니다 CheckedStatus [100].의 getView에서 위치는 당신이 링크를 끊어이 setOnCheckedChangeListener .This 방법을 호출 한 후을 setChecked 사용자 지정 목록보기 어댑터 호출에서의 getView 기능

1

에서 수신 된 하나입니다

if(CheckedStatus[position] == true) { 
// check the check box 
} else { 
// uncheck it 
}. 

을 재생 된 뷰의 오래된 수신기.