2016-10-08 6 views
0

ListView를 사용하여 TextViews를 일부 행에 표시하고 다른 행에는 표시하지 않습니다. 얼마나 많은 항목이 있을지는 모르지만 잘 실행되지만 아래로 스크롤하면 화면이 변경됩니다.안드로이드 ListView 스크롤시 데이터 손실

사용자가 보고서 및 설문 조사를 작성하는 앱을 만들고 있습니다. 하나의 액티비티에는 EditTexts, Checkbox 및 TextView가 포함 된 ListView가 있습니다.

EditTexts 및 Checkbox의 문제점은 스크롤 할 때 콘텐츠가 손실된다는 것입니다. 검사 상태를 배열에 저장하여 확인란 문제를 해결할 수 있었지만 EditTexts로 문제를 해결할 수 없습니다. 이 특정 문제에 대해 몇 가지 질문이 있지만 제공 한 솔루션이 제대로 작동하지 않는 것으로 알고 있습니다.

이 BaseAdapter를 사용하고 있습니다.

public class ProductAdapter extends BaseAdapter { 

private Context mContext; 
private List<Model> models = new ArrayList<>(); 
private ModelTable avModelTable = new ModelTable(); 
private BrandTable brandTable = new BrandTable(); 

public ProductAdapter(Context mContext, List<Model> models) { 
    this.mContext = mContext; 
    this.models = models; 

} 


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

@Override 
public Model getItem(int i) { 
    return models.get(i); 
} 

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


@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 

    ProductHolder item = new ProductHolder(); 
    View row = view; 
    if (row == null) { 

     LayoutInflater mInflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     row = mInflater.inflate(R.layout.product_item, viewGroup, false); 

     item.nameProduct = (TextView) row.findViewById(R.id.nameProduct); 
     item.subCategoryProduct = (TextView) row.findViewById(R.id.subCategoryProduct); 
     item.productGroup = (RadioGroup) row.findViewById(R.id.groupRadioProduct); 
     item.oos_product = (RadioButton) row.findViewById(R.id.oos_product); 
     item.av_product = (RadioButton) row.findViewById(R.id.av_product); 
     item.shelfProduct = (EditText) row.findViewById(R.id.shelfProduct); 
     item.quantityProduct = (EditText) row.findViewById(R.id.quantityProduct); 
     item.priceProduct = (EditText) row.findViewById(R.id.priceProduct); 
     item.layoutBrand = (LinearLayout) row.findViewById(R.id.layoutBrand); 
     item.avBrand = (EditText) row.findViewById(R.id.avBrand); 


     row.setTag(item); 
    } else { 
     item = (ProductHolder) row.getTag(); 
    } 

    final Model model = models.get(i); 

    item.nameProduct.setText(model.getProduct_name()); 
    item.subCategoryProduct.setText(brandTable.getBrandName(model.getBrand_id())); 

    if (model.getQuantity() != 0) { 
     item.quantityProduct.setText(String.valueOf(model.getQuantity())); 
    } 
    if (model.getShelf() != 0) { 
     item.shelfProduct.setText(String.valueOf(model.getShelf())); 
    } 

    if (model.getPrice() != null) { 
     item.priceProduct.setText(model.getPrice()); 
    } 

    if (model.getBrand_id() == 1) { 

     item.layoutBrand.setVisibility(View.GONE); 
     item.avBrand.setVisibility(View.GONE); 
     item.productGroup.setVisibility(View.VISIBLE); 
     item.oos_product.setVisibility(View.VISIBLE); 
     item.av_product.setVisibility(View.VISIBLE); 

     switch (model.getAv()) { 
      case 0: 
       item.oos_product.setChecked(true); 
       break; 
      case 1: 
       item.av_product.setChecked(true); 
       break; 
      default: 
       break; 
     } 

     item.productGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(RadioGroup radioGroup, int i) { 
       switch (i) { 
        case R.id.oos_product: 
         avModelTable.updateAv(model.getId(), 0); 
         break; 
        case R.id.av_product: 
         avModelTable.updateAv(model.getId(), 1); 
         break; 
        default: 
         break; 
       } 

      } 

     }); 


    } else { 


     item.layoutBrand.setVisibility(View.VISIBLE); 
     item.avBrand.setVisibility(View.VISIBLE); 
     item.productGroup.setVisibility(View.GONE); 
     item.oos_product.setVisibility(View.GONE); 
     item.av_product.setVisibility(View.GONE); 


     item.avBrand.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
              int arg3) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub 
       if (arg0.toString().equals("")) { 
        avModelTable.updateAv(model.getId(), 0); 
       } else avModelTable.updateAv(model.getId(), Integer.parseInt(arg0.toString())); 

      } 
     }); 

    } 


    item.shelfProduct.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
      if (arg0.toString().equals("")) { 
       avModelTable.updateShelf(model.getId(), 0); 
      } else avModelTable.updateShelf(model.getId(), Integer.parseInt(arg0.toString())); 

     } 
    }); 

    item.quantityProduct.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
      if (arg0.toString().equals("")) { 
       avModelTable.updateQuantity(model.getId(), 0); 
      } else 
       avModelTable.updateQuantity(model.getId(), Integer.parseInt(arg0.toString())); 

     } 
    }); 

    item.priceProduct.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
      if (arg0.toString().equals("")) { 
       avModelTable.updatePrice(model.getId(), null); 
      } else 
       avModelTable.updatePrice(model.getId(), arg0.toString()); 

     } 
    }); 


    return row; 
} 


private class ProductHolder { 
    private TextView nameProduct, subCategoryProduct; 
    private RadioButton oos_product, av_product; 
    private RadioGroup productGroup; 
    private EditText shelfProduct, quantityProduct, priceProduct, avBrand; 
    private LinearLayout layoutBrand; 

} 

}

+0

당신은 그것을 위해 어떤 해결책을 얻었습니까 ??? 나는 여기에도 같은 문제가있다. ( –

답변

0

나는 당신의 어댑터를 사용하여 테스트 코드를했지만 다른 뷰/모델 그것을 시도했지만 작동하지 않았다. 내가 바꾼 후에 만 ​​작동했습니다. View row = view; 코드 getView의 시작 부분에 View row = null;을 입력하면 매번보기를 부 풀릴 수 있습니다. 그래서 문제가 item = (ProductHolder) row.getTag(); 부분에 있다고 생각합니다. 아마도 ProductHolder 모델이 올바르지 않습니다.