Android:ListView软件反转项目

我有一个自定义ListView与CheckBox和两个EditTexts。 当我点击一个EditText并出现软键盘时,会发生一件奇怪的事情:ListView中的项目颠倒原来的顺序。 当我调试时,我看到当软键盘出现时调用自定义ArrayAdapter的getView()。 然后我认为每次出现软键盘时都会重新绘制ListView。 没关系,但为什么它会颠倒项目的顺序? 还有一点需要说的是,当我第一次点击一个EditText时,焦点就会丢失。 第二次,我点击一个EditText,没有什么奇怪的事情发生,但ListView继续颠倒。 关闭软键盘后,ListView会回到原来的顺序。 我已经把android:focusable =“false”并且问题继续发生。

谁能帮我?

这是布局:

<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>

编辑:我把一个EditText列表视图之外,并点击它来测试和相同的问题发生。 然后,当软键盘出现时,列表视图被重新绘制倒置。

编辑2:经过另一次测试后,我发现列表视图在调整大小时会颠倒顺序。 在清单中放置android:windowSoftInputMode =“adjustPan”会使其正常工作,但不会调整大小。 任何人都有一些想法,为什么调整大小时订单改变?


它看起来在适配器类的getView方法中有一个错误,你不能把你的textview.setText()放在if(convertView == null)块中。 尝试这个。

    @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;
}
链接地址: http://www.djcxy.com/p/93425.html

上一篇: Android: ListView reverses the items when soft

下一篇: Adjust layout when soft keyboard is on