2016-10-07 2 views
-3

작은 휴대 전화에서 실행했을 때 체크 박스가있는 사용자 정의 목록보기가 있습니다. 목록보기에 이미 5 개 항목이 있고 항목 1을 선택하면 항목 5가 선택됩니다. 체크 된 항목 5, 그 다음에 항목 1도 점검 될 것이고, 그것은 항목 (2-6,3-7,4-8, 등)과 함께 일어난다.체크 박스 버그 목록보기 android

하지만 내 목록보기에 4 개 항목이 있다면 문제가 발생하지 않습니다. 여기 내 목록보기 어댑터 :

http://pastebin.com/mTEiXryf

당신이 내 버그를 해결하는 데 도움이 수 있을까요? 사전

+0

데이터 목록에 CheckBox의 상태를 저장하지 않고 데이터에 따라 CheckBox를 업데이트했다고 생각합니다. https://stackoverflow.com/questions/39926388/spannable-string-only-working-for-last-item-in-listview/39950834#39950834에 대한 내 답변을 살펴 보시기 바랍니다. –

답변

3

감사는 당신이 더 나은 다음이 나를

근무 이런 식으로, 체크 박스 Boolean 배열을 유지하려고 listview을 사용하려는 경우 Recyclerview

public class CardViewDataAdapter extends 
    RecyclerView.Adapter<CardViewDataAdapter.ViewHolder> { 

private List<Student> stList; 

public CardViewDataAdapter(List<Student> students) { 
    this.stList = students; 

} 

// Create new views 
@Override 
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
    int viewType) { 
    // create a new view 
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
    R.layout.cardview_row, null); 

    // create ViewHolder 

    ViewHolder viewHolder = new ViewHolder(itemLayoutView); 

    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 

    final int pos = position; 

    viewHolder.tvName.setText(stList.get(position).getName()); 

    viewHolder.tvEmailId.setText(stList.get(position).getEmailId()); 

    viewHolder.chkSelected.setChecked(stList.get(position).isSelected()); 

    viewHolder.chkSelected.setTag(stList.get(position)); 


    viewHolder.chkSelected.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    CheckBox cb = (CheckBox) v; 
    Student contact = (Student) cb.getTag(); 

    contact.setSelected(cb.isChecked()); 
    stList.get(pos).setSelected(cb.isChecked()); 

    Toast.makeText(
     v.getContext(), 
     "Clicked on Checkbox: " + cb.getText() + " is " 
     + cb.isChecked(), Toast.LENGTH_LONG).show(); 
    } 
    }); 

} 

// Return the size arraylist 
@Override 
public int getItemCount() { 
    return stList.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView tvName; 
    public TextView tvEmailId; 

    public CheckBox chkSelected; 

    public Student singlestudent; 

    public ViewHolder(View itemLayoutView) { 
    super(itemLayoutView); 

    tvName = (TextView) itemLayoutView.findViewById(R.id.tvName); 

    tvEmailId = (TextView) itemLayoutView.findViewById(R.id.tvEmailId); 
    chkSelected = (CheckBox) itemLayoutView 
    .findViewById(R.id.chkSelected); 

    } 

} 

// method to access in activity after updating selection 
public List<Student> getStudentist() { 
    return stList; 
} 

} 

또는 를 사용하는 것이 좋습니다

public class CustomAdapter extends BaseAdapter { 
    private final LayoutInflater inflater; 
    private final Context context; 
    private List<ModelPooja> listData; 

    public CustomAdapter(Context mainActivity, List<ModelPooja> listData) { 
     context = mainActivity; 
     this.listData = listData; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

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

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.list_item_poojaselection, null); 
      holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname); 
      holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.checks.setOnCheckedChangeListener(null); 
     holder.checks.setFocusable(false); 

     if (listData.get(position).isselected) { 
      holder.checks.setChecked(true); 
     } else { 
      holder.checks.setChecked(false); 
     } 

     holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton cb, boolean b) { 

       if (checkMaxLimit()) { 

        if (listData.get(position).isselected && b) { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 

        } else { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 
         Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show(); 
        } 
       } else { 
        if (b) { 
         listData.get(position).isselected = true; 
        } else { 
         listData.get(position).isselected = false; 
        } 
       } 
      } 
     }); 

     holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME()); 
     return convertView; 
    } 

    public boolean checkMaxLimit() { 
     int countermax = 0; 
     for(ModelPooja item : listData){ 
      if(item.isselected){ 
       countermax++; 
      } 
     } 
     return countermax >= 5; 
    } 

    public class ViewHolder { 
     TextView tv; 
     public CheckBox checks; 
    } 
} 
0

여기 해결책입니다. holder.chkbox.setOnClickListener를 잘못된 위치에 추가 했으므로 올바른 위치에 놓았습니다. 이 코드로 코드 바꾸기

if(convertView == null) { 
     convertView = myInflater.inflate(R.layout.customviewitemcashier, null); 
     holder = new ViewHolder(); 
     holder.tvitemcode = (TextView) convertView.findViewById(R.id.tvitemcode); 
     holder.tvitemname = (TextView) convertView.findViewById(R.id.tvitemname); 
     holder.tvprice = (TextView) convertView.findViewById(R.id.tvprice); 
     holder.tvsubtotal = (TextView) convertView.findViewById(R.id.tvsubtotal); 
     holder.edtqty = (EditText) convertView.findViewById(R.id.edtqty); 
     holder.imgincrease = (TextView) convertView.findViewById(R.id.imgincrease); 
     holder.imgdecrease = (TextView) convertView.findViewById(R.id.imgdecrease); 
     holder.imgitem= (ImageView) convertView.findViewById(R.id.imgitem); 
     holder.chkbox = (CheckBox) convertView.findViewById(R.id.checkbox); 

     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.chkbox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (holder.chkbox.isChecked()) { 
       SQLiteDatabase dbinsert = dbHelper.getWritableDatabase(); 
       String SQLinsert = "INSERT INTO itemcheckedcontainer (`item_code`) VALUES (" + 
         "'" + DataProcessorResult.get(position).getItemCode() + "')"; 
       dbinsert.execSQL(SQLinsert); 
      } else { 
       SQLiteDatabase dbdelete = dbHelper.getWritableDatabase(); 
       String SQLdelete = "DELETE FROM itemcheckedcontainer WHERE item_code=" + 
         "'" + DataProcessorResult.get(position).getItemCode() + "'"; 
       dbdelete.execSQL(SQLdelete); 
      } 
     } 
    }); 

문제가 해결되었습니다.

+0

동일한 결과 동생, 내가 밖으로 넣어 전에. 내 코딩을 확인, 나는 발언을주고 내부 convertview로 옮겼습니다. –

+0

은 업데이트 된 어댑터 코드를 공유합니다. – Shane