2012-02-23 17 views
1

CheckBoxと2つのEditTextを持つカスタムListViewがあります。 EditTextをクリックすると、奇妙なことが起こり、ソフトキーボードが現れます.ListViewの項目は元の順序を逆転させます。私がデバッグしたとき、私は、カスタムArrayAdapterのgetView()がソフトキーボードが現れたときに呼び出されることを知りました。次に、ソフトキーボードが表示されるたびにListViewが再描画されると思います。それは大丈夫ですが、なぜアイテムの順序が逆転するのですか? もう1つ言いたいことは、初めてEditTextをクリックするとフォーカスが失われるということです。 2回目のEditTextをクリックすると、奇妙なことは起こりませんが、ListViewは反転し続けます。ソフトキーボードを解除すると、ListViewが元の順序に戻ります。 私はすでにアンドロイドを置いています:focusable = "false"と問題が続いています。Android:ListViewは、ソフトキーボードが表示されたときに項目を反転します。

誰でも手伝ってもらえますか?

これはレイアウトです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/relativeLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="10dp" > 

     <TextView 
      android:id="@+id/tv_nome_lista" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:text="@string/nome_lista_compra" /> 

     <TextView 
      android:id="@+id/tv_local_lista" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_below="@+id/tv_nome_lista" 
      android:text="@string/local_lista_compra" /> 

    </RelativeLayout> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:focusable="false" > 
    </ListView> 

    <TextView 
     android:id="@+id/tv_preco_total_lista" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/preco_total_lista" /> 

</LinearLayout> 

これは、カスタムアダプタです:

プライベートクラスProdutosAdapterはArrayAdapter {

public ProdutosAdapter() { 
     super(CompraActivity.this, R.layout.compra_item, lista.getProdutos()); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.compra_item, parent, false); 


      final Produto produto = CompraActivity.this.lista.getProdutos().get(position); 

      CheckBox cbCompradoProduto = (CheckBox) convertView.findViewById(R.id.cb_comprado_produto); 
      TextView tvNomeProduto = (TextView) convertView.findViewById(R.id.tv_nome_produto); 
      EditText etQuantidadeProduto = (EditText) convertView.findViewById(R.id.et_quantidade_produto); 
      EditText etPrecoProduto = (EditText) convertView.findViewById(R.id.et_preco_produto); 
      etPrecoProduto.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(CompraActivity.this.currencyFormat.getCurrency().getDefaultFractionDigits())}); 

      //TextView tvVezes = (TextView) convertView.findViewById(R.id.tv_vezes); 
      //tvVezes.setText(getString(R.string.vezes) + " " + currencyFormat.getCurrency().getSymbol()); 

      cbCompradoProduto.setChecked(produto.isComprado()); 
      tvNomeProduto.setText(produto.getNome()); 
      etQuantidadeProduto.setText(produto.getQuantidade().toString()); 
      etPrecoProduto.setText(decimalFormat.format(produto.getPreco())); 

      /*cbCompradoProduto.setOnCheckedChangeListener(new OnCheckedChangeListener() 
      { 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
       { 
        produto.setComprado(isChecked); 
        atualizarPrecoTotal(); 
        produtosModificados.add(produto); 
       } 
      }); 

      etQuantidadeProduto.addTextChangedListener(new TextWatcher(){ 
       public void afterTextChanged(Editable s) { 
        if(!s.toString().equals("")){ 
         produto.setQuantidade(Integer.parseInt(s.toString())); 
        } 
        atualizarPrecoTotal(); 
        produtosModificados.add(produto); 
       } 
       public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
       public void onTextChanged(CharSequence s, int start, int before, int count){} 
      }); 

      etPrecoProduto.addTextChangedListener(new TextWatcher(){ 
       public void afterTextChanged(Editable s) { 
        try { 
         produto.setPreco(decimalFormat.parse(s.toString()).doubleValue()); 
        } catch (ParseException e) { 

        } 
        atualizarPrecoTotal(); 
        produtosModificados.add(produto); 
       } 
       public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
       public void onTextChanged(CharSequence s, int start, int before, int count){} 
      }); 

      etPrecoProduto.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

       @Override 
       public void onFocusChange(View v, boolean hasFocus) { 
        if(!hasFocus){ 
         ((EditText)v).setText(decimalFormat.format(produto.getPreco())); 
        } 
       } 
      });*/ 
     } 
     return convertView; 
    } 

そしてこれは、アイテムのレイアウトですが拡張:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <CheckBox 
     android:id="@+id/cb_comprado_produto" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" /> 

    <TextView 
     android:id="@+id/tv_nome_produto" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/cb_comprado_produto" 
     android:layout_alignBottom="@+id/cb_comprado_produto" 
     android:layout_toRightOf="@+id/cb_comprado_produto" 
     android:text="@string/nome_produto" /> 

    <EditText 
     android:id="@+id/et_preco_produto" 
     android:layout_width="65dp" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/tv_nome_produto" 
     android:layout_alignBottom="@+id/tv_nome_produto" 
     android:layout_alignParentRight="true" 
     android:inputType="numberDecimal" /> 

    <TextView 
     android:id="@+id/tv_vezes" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/et_preco_produto" 
     android:layout_alignBottom="@+id/et_preco_produto" 
     android:layout_toLeftOf="@+id/et_preco_produto" 
     android:text="@string/vezes" /> 

    <EditText 
     android:id="@+id/et_quantidade_produto" 
     android:layout_width="40dp" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/tv_nome_produto" 
     android:layout_alignBottom="@+id/tv_nome_produto" 
     android:layout_toLeftOf="@+id/tv_vezes" 
     android:inputType="number" /> 

</RelativeLayout> 

EDIT: EditTextをリストビューの外に置き、それをクリックしてテストし、同じ問題が発生しました。次に、ソフトキーボードが表示されると、リストビューが反転して再描画されます。

EDIT2:別のテストの後で、リストビューのサイズが変更されたときにリストビューが逆順になっていることがわかりました。アンドロイドを置く:マニフェスト内のwindowSoftInputMode = "adjustPan"はうまく動作しますが、サイズを調整しません。サイズ変更時に順序が変わるのはなぜですか?

+0

hmmmあなたのコードは奇妙に見えます。:) – waqaslam

答えて

3

アダプタークラスからur getViewメソッドにエラーがあるようですが、(convertView == null)ブロックの場合は、内にtextview.setText()を配置しないとします。これを試して。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.compra_item, parent, false); 
    } 

    final Produto produto = CompraActivity.this.lista.getProdutos().get(position); 

    CheckBox cbCompradoProduto = (CheckBox) convertView.findViewById(R.id.cb_comprado_produto); 
    TextView tvNomeProduto = (TextView) convertView.findViewById(R.id.tv_nome_produto); 
    EditText etQuantidadeProduto = (EditText) convertView.findViewById(R.id.et_quantidade_produto); 
    EditText etPrecoProduto = (EditText) convertView.findViewById(R.id.et_preco_produto); 
    etPrecoProduto.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(CompraActivity.this.currencyFormat.getCurrency().getDefaultFractionDigits())}); 

    //TextView tvVezes = (TextView) convertView.findViewById(R.id.tv_vezes); 
    //tvVezes.setText(getString(R.string.vezes) + " " + currencyFormat.getCurrency().getSymbol()); 

    cbCompradoProduto.setChecked(produto.isComprado()); 
    tvNomeProduto.setText(produto.getNome()); 
    etQuantidadeProduto.setText(produto.getQuantidade().toString()); 
    etPrecoProduto.setText(decimalFormat.format(produto.getPreco())); 

    return convertView; 
} 
+0

True!ありがとう、PeirHwa.Soo。ビュー・ホルダを持つリスト・ビューを作成する適切な方法を見てみましょう:[HowTo:ListView、アダプタ、getView、および1つのListView内の異なるリスト項目のレイアウト](http://android.amberfog.com/?p=296)このエチケットは、多くの行を含むリストビューに特に便利です。 – abriggs

関連する問題