2016-08-20 3 views
2

나는 CheckBox를 선택했을 때 Spinner에서 값을 선택하고 SetEnabled를 True/False로 설정하면됩니다.스크롤 할 때 사용자 지정 ListView에서 회 전자가 임의로 변경됨

예를 들어 chekcbox를 선택하면 스피너가 활성화되고 확인란의 선택을 취소하면 반대가됩니다.

그러나 스크롤 할 때 무작위로 변경됩니다.

이 내 코드 :

CustomListView.java

class CustomListView extends BaseAdapter { 
    private ArrayList<ListItem2> listData; 
    private LayoutInflater layoutInflater; 
    private Context context; 

    public CustomListView adapter = this; 
    String jmlCmbSiap; 
    ArrayList<String> a = new ArrayList<>(); 
    public CustomListView(Context context, ArrayList<ListItem2> listData) { 
     this.listData = listData; 
     layoutInflater = LayoutInflater.from(context); 
     this.context = context; 
    } 

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

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

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     newsItem = listData.get(position); 

     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.listview_detail_order, null); 
      holder = new ViewHolder(); 
      newsItem.setAdapter(Integer.parseInt(newsItem.getJumlah())); 
      holder.txtBarang = (TextView) convertView.findViewById(R.id.txtBarang); 
      holder.txtJumlah = (TextView) convertView.findViewById(R.id.txtJumlah); 
      holder.txtBox = (TextView) convertView.findViewById(R.id.txtBoxes); 
      holder.cmbSiap = (Spinner) convertView.findViewById(R.id.cmbSiap); 
      holder.cmbSiap.setAdapter(newsItem.getAdapter()); 
      holder.thumbImage = (ImageView) convertView.findViewById(R.id.thumbImage); 
      holder.chkOk = (CheckBox) convertView.findViewById(R.id.chkOk); 
      convertView.setTag(holder); 

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

     Picasso 
       .with(context) 
       .load(newsItem.getImg()) 
       .placeholder(R.drawable.placeholder) 
       .error(R.drawable.placeholder) 
       .into(holder.thumbImage); 


     holder.txtBarang.setText(newsItem.getNamaProduk().toUpperCase()); 
     holder.txtJumlah.setText(newsItem.getJumlah().toUpperCase()); 

     holder.cmbSiap.setSelection(Integer.parseInt(newsItem.getJumlah())); 
     holder.cmbSiap.setEnabled(newsItem.getcmbSiap()); 
     holder.txtBox.setEnabled(newsItem.gettxtBox()); 

     holder.cmbSiap.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       jmlCmbSiap = parent.getItemAtPosition(position).toString(); 
       newsItem.setJumlah(jmlCmbSiap); 
       holder.cmbSiap.setSelection(Integer.parseInt(newsItem.getJumlah())); 
       System.out.println("JML : " + newsItem.getJumlah()); 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     holder.chkOk.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (newsItem.getchkOk() == false) { 
        newsItem.setcmbSiap(true); 
        newsItem.setchkOk(true); 
        newsItem.settxtBox(true); 
        holder.cmbSiap.setEnabled(true); 
        holder.chkOk.setChecked(true); 
        txtBox.setEnabled(true); 
        numberChecked = numberChecked + 1; 
        idChkOk.add(position); 
        System.out.println("Chk : " + idChkOk); 
       } else { 
        numberChecked = numberChecked - 1; 
        newsItem.setcmbSiap(false); 
        newsItem.setchkOk(false); 
        holder.cmbSiap.setEnabled(false); 
        holder.chkOk.setChecked(false); 
        if (numberChecked == 0) { 
         newsItem.settxtBox(false); 
         txtBox.setEnabled(false); 
        } 
        idChkOk.remove(position); 
        System.out.println("Chk : " + idChkOk); 
       } 
      } 
     }); 

     cmdPak.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       a.clear(); 
       for (int i = 0; i < listData.size(); i++) 
       { 
        newsItem = listData.get(i); 
        a.add(newsItem.getJumlah().toString()); 
       } 
       System.out.println("Pak : " + a); 
      } 
     }); 

     return convertView; 
    } 

    class ViewHolder { 
     TextView txtBarang,txtJumlah,txtBox; 
     Spinner cmbSiap; 
     ImageView thumbImage; 
     CheckBox chkOk; 

    } 
} 

ListItem2.java

class ListItem2 { 

    private String shipment; 
    private String truck; 
    private String transporter; 
    private String tanggal; 
    private String order; 
    private String nilai; 
    private String alamat; 
    private String status; 
    private String jumlah; 
    private String namaProduk; 
    private String img; 
    private String sopir; 
    private String jumlahTerima; 
    private String alasan; 
    private String orderTemp; 
    private Boolean chkOk; 
    private Boolean cmbSiap; 
    private Boolean txtBox; 
    private ArrayAdapter<CharSequence> adapter; 
    private ArrayList<String> array = new ArrayList<String>(); 

    public void setAdapter(Integer jml) 
    { 
     for (int i = 0; i<= jml; i++) { 
      array.add(String.valueOf(i)); 
     } 
     adapter = new ArrayAdapter(DetailOrder.this,android.R.layout.simple_spinner_item,array); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    } 

    public ArrayAdapter<CharSequence> getAdapter() 
    { 
     return adapter; 
    } 

    public void setTanggal(String tanggal) { 
     this.tanggal = tanggal; 
    } 

    public String getOrder() { 
     return order; 
    } 

    public void setOrder(String order) { 
     this.order = order; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public String getAlamat() { 
     return alamat; 
    } 

    public void setAlamat(String alamat) { 
     this.alamat = alamat; 
    } 

    public String getNilai() { 
     return nilai; 
    } 

    public void setNilai(String nilai) { 
     this.nilai = nilai; 
    } 

    public String getKodeProduk() { 
     return nilai; 
    } 

    public void setKodeProduk(String nilai) { 
     this.nilai = nilai; 
    } 

    public String getNamaProduk() { 
     return namaProduk; 
    } 

    public void setNamaProduk(String namaProduk) { 
     this.namaProduk = namaProduk; 
    } 

    public String getJumlah() { 
     return jumlah; 
    } 

    public void setJumlah(String jumlah) { 
     this.jumlah = jumlah; 
    } 

    public Boolean getchkOk() { 
     return chkOk; 
    } 

    public void setchkOk(Boolean chkOk) { 
     this.chkOk = chkOk; 
    } 

    public Boolean getcmbSiap() { 
     return cmbSiap; 
    } 

    public void setcmbSiap(Boolean cmbSiap) { 
     this.cmbSiap = cmbSiap; 
    } 

    public Boolean gettxtBox() { 
     return txtBox; 
    } 

    public void settxtBox(Boolean txtBox) { 
     this.txtBox = txtBox; 
    } 
} 

당신이 내게 손을 빌려 수 있을까요?

업데이트 : 당신이 스크롤 할 때의 ListView에서

chkAll.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       View views; 
       CheckBox chkOkx; 
       Spinner cmbSiap; 
       for (int i = 0; i < jArray; i++) { 
        final ListItem2 newsItem = listData.get(i); 
        views = listView.getChildAt(i); 
        if (views == null) { 
         return; 
        } else { 
         chkOkx = (CheckBox) views.findViewById(R.id.chkOk); 
         cmbSiap = (Spinner) views.findViewById(R.id.cmbSiap); 
         if (chkOkx.isChecked()) { 
          newsItem.setchkOk(true); 
          newsItem.setcmbSiap(true); 
          chkOkx.setChecked(newsItem.getchkOk()); 
          cmbSiap.setEnabled(newsItem.getcmbSiap()); 
         } else { 
          newsItem.setchkOk(false); 
          newsItem.setcmbSiap(false); 
          chkOkx.setChecked(newsItem.getchkOk()); 
          cmbSiap.setEnabled(newsItem.getcmbSiap()); 
         } 
         idChkOk.add(i); 
        } 
       } 

       if (chkAll.isChecked()) { 
        txtBox.setEnabled(true); 
        numberChecked = 0; 
       } else { 
        txtBox.setEnabled(false); 
        numberChecked = listviewChild; 
       } 
       listView.invalidateViews(); 
      } 
     }); 

답변

1

는, 뷰가 파괴되고 다시 만들었습니다. 이 문제를 해결하려면 확인란 상태와 스피너 항목의 값을 모두 보존해야합니다.체크 박스를 들어

는 적용) ( 의 getView에

private boolean[] checkBoxState; 

나중에

if (((CheckBox) v).isChecked()) { 
     checkBoxState[position] = true; 
    } else { 
     checkBoxState[position] = false; 
    } 

는 부울 배열이 좋아한다, 부울 배열 내부 setOnClickListener에서 확인 상태를 저장 배열을 기반으로 각 체크 박스 항목의 상태 확인/선택 취소

마찬가지로

저장된에서 스피너 선택 위치를 복원 해시 맵

Map<Integer, Integer> myMap = new HashMap<Integer, Integer>(); 

를 작성, 스피너 데이터를 저장하고이

myMap.put(position, pos); 

나중에 setOnItemSelectedListener에서 선정 된 후에는 회 전자 데이터를 저장하기 데이터,

if (myMap.containsKey(position)) { 
      viewHolder.spinner.setSelection(myMap.get(position)); 
     } 

전체 코드,

class CustomListView extends BaseAdapter { 

    private ArrayList<ListItem2> listData; 
    private LayoutInflater layoutInflater; 
    private Context context; 

    public CustomListView adapter = this; 
    String jmlCmbSiap; 
    ArrayList<String> a = new ArrayList<>(); 

    private boolean[] checkBoxState; 
    private Map<Integer, Integer> myMap = new HashMap<Integer, Integer>(); 

    public CustomListView(Context context, ArrayList<ListItem2> listData) { 
     this.listData = listData; 
     layoutInflater = LayoutInflater.from(context); 
     checkBoxState = new boolean[listData.size()]; 
     this.context = context; 
    } 

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

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

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     newsItem = listData.get(position); 

     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.listview_detail_order, null); 
      holder = new ViewHolder(); 
      newsItem.setAdapter(Integer.parseInt(newsItem.getJumlah())); 
      holder.txtBarang = (TextView) convertView.findViewById(R.id.txtBarang); 
      holder.txtJumlah = (TextView) convertView.findViewById(R.id.txtJumlah); 
      holder.txtBox = (TextView) convertView.findViewById(R.id.txtBoxes); 
      holder.cmbSiap = (Spinner) convertView.findViewById(R.id.cmbSiap); 
      holder.cmbSiap.setAdapter(newsItem.getAdapter()); 
      holder.thumbImage = (ImageView) convertView.findViewById(R.id.thumbImage); 
      holder.chkOk = (CheckBox) convertView.findViewById(R.id.chkOk); 
      convertView.setTag(holder); 

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

     holder.checkBox.setChecked(checkBoxState[position]); 

     if (checkBoxState[position]) 
     { 
      holder.chkOk.setChecked(true); 
      newsItem.setcmbSiap(true); 
      newsItem.settxtBox(true); 

      holder.cmbSiap.setEnabled(true); 
      holder.cmbSiap.setClickable(true); 

      txtBox.setEnabled(true); 
     } 
     else 
     { 
      holder.chkOk.setChecked(false); 
      newsItem.setcmbSiap(false); 
      newsItem.settxtBox(false); 

      holder.cmbSiap.setEnabled(false); 
      holder.cmbSiap.setClickable(false); 

      txtBox.setEnabled(false); 
     } 

     Picasso 
       .with(context) 
       .load(newsItem.getImg()) 
       .placeholder(R.drawable.placeholder) 
       .error(R.drawable.placeholder) 
       .into(holder.thumbImage); 


     holder.txtBarang.setText(newsItem.getNamaProduk().toUpperCase()); 
     holder.txtJumlah.setText(newsItem.getJumlah().toUpperCase()); 

     holder.cmbSiap.setSelection(Integer.parseInt(newsItem.getJumlah())); 
     holder.cmbSiap.setEnabled(newsItem.getcmbSiap()); 
     holder.txtBox.setEnabled(newsItem.gettxtBox()); 

     if (myMap.containsKey(position)) { 
      viewHolder.spinner.setSelection(myMap.get(position)); 
     } 

     holder.cmbSiap.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
       jmlCmbSiap = parent.getItemAtPosition(position).toString(); 
       newsItem.setJumlah(jmlCmbSiap); 

       myMap.put(position, pos); 

       System.out.println("JML : " + newsItem.getJumlah()); 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     holder.chkOk.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //is chkOk checked? 
       if (((CheckBox) v).isChecked()) { 
        checkBoxState[position] = true; 
        viewHolder.spinner.setEnabled(true); 
        viewHolder.spinner.setClickable(true); 
       } else { 
        checkBoxState[position] = false; 
        viewHolder.spinner.setEnabled(false); 
        viewHolder.spinner.setClickable(false); 
       } 
      } 
     }); 

     cmdPak.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       a.clear(); 
       for (int i = 0; i < listData.size(); i++) 
       { 
        newsItem = listData.get(i); 
        a.add(newsItem.getJumlah().toString()); 
       } 
       System.out.println("Pak : " + a); 
      } 
     }); 

     return convertView; 
    } 

    class ViewHolder { 
     TextView txtBarang,txtJumlah,txtBox; 
     Spinner cmbSiap; 
     ImageView thumbImage; 
     CheckBox chkOk; 

    } 
} 

업데이트 : A 모두 선택/선택 취소 모든 체크 박스 기능을하기 위해

,

어댑터의 클래스의 상단에 부울 플래그를 생성,

boolean isCheckAll = false; 

다음 토글 방법을 만듭니다.

이제
public void toggleCheckAll() { 

     isCheckAll = !isCheckAll; 

     for (int i = 0; i < listData.size(); i++) { 
      if (isCheckAll) { 
       checkBoxState[i] = true; 
       notifyDataSetInvalidated(); 
      } else { 
       checkBoxState[i] = false; 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 

당신의 aactivity 수표 모든 버튼의 클릭에서 메소드를 호출 (210),

btnCheckAll.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       adapter.toggleCheckAll(); 

      } 
     }); 
관련 문제