首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android - Keypad - EditText在ListView中的意外行为

Android - Keypad - EditText在ListView中的意外行为
EN

Stack Overflow用户
提问于 2015-05-08 10:52:35
回答 2查看 2.8K关注 0票数 3

自过去两天以来,我一直在处理问题,例如,我用Custom View创建了Custom ViewVariant SubLayout,例如:

问题:

  • 当我单击EditText of Qty时,它会显示带有数字键盘的软输入键盘,并立即失去焦点。 随字母键盘变化的编辑文本。(下面是第一个ScreenShot )

  • EditText的第二次聚焦中,它的工作原理很好,并接受数值,但是在滚动它的键盘时,它会从数字变为字母。(下面是第二个ScreenShot )

实际上,我可以理解问题在于它在显示/隐藏键盘上正在改变什么,因为该视图每次都在更新,所以我能做些什么来继续关注EditText或防止在显示/隐藏键盘上刷新视图。

我的适配器代码是:

代码语言:javascript
复制
class MyGridViewAdapter extends BaseAdapter {

    private ArrayList<ProductItems> productItemList;
    private LayoutInflater inflater = null;

    ViewHolder holder;

    double productQtyValue;
    double productRateValue;
    double productDiscountValue;
    double productOfferDiscValue;
    double productDiscountedRateValue;

    double amount;

    public MyGridViewAdapter(ArrayList<ProductItems> productItemsList) {
        // TODO Auto-generated constructor stub
        this.productItemList = productItemsList;
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return productItemList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return productItemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        if (convertView == null) {

            if(isViewWithCatalog)
                convertView = inflater.inflate(R.layout.list_product_view_catalog, null);
            else
                convertView = inflater.inflate(R.layout.list_product_view, null);

            holder = new ViewHolder();

            holder.prodIsNewView    = (ImageView) convertView.findViewById(R.id.productIsNewImageView);
            holder.prodImageView    = (ImageView) convertView.findViewById(R.id.productImage);
            holder.prodNameView     = (TextView) convertView.findViewById(R.id.productNameTextView);
            holder.prodStockView    = (TextView) convertView.findViewById(R.id.productStockTextView);
            holder.prodQtyView      = (EditText) convertView.findViewById(R.id.productQuantityValue);

            holder.prodRateView     = (TextView) convertView.findViewById(R.id.productRateValue);
            holder.prodDiscView     = (TextView) convertView.findViewById(R.id.productDiscountValue);
            holder.prodOfferDiscView= (TextView) convertView.findViewById(R.id.productOfferDiscountTextViewValue);

            holder.prodOriginalRateView = (TextView) convertView.findViewById(R.id.productOriginalRateValue);
            holder.prodPackingQtyView = (TextView) convertView.findViewById(R.id.productBundleQtyView);

            //TextView for Amount
            holder.prodAmountView   = (TextView) convertView.findViewById(R.id.productAmountValue);
            holder.prodPriceTagView = (TextView) convertView.findViewById(R.id.productPriceTagTitle);
            holder.layoutDiscountView = (LinearLayout) convertView.findViewById(R.id.productViewMiddle);

            holder.priceLayoutView1 = (LinearLayout) convertView.findViewById(R.id.productEditTextViewAbove);
            holder.priceLayoutView2 = (LinearLayout) convertView.findViewById(R.id.productViewMiddle);

            holder.prodQtyView.addTextChangedListener(new GeneralTextWatcher(holder));

            convertView.setTag(holder);

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

        final ProductItems currentProductItem = productItemList.get(position);

        holder.prodId           = currentProductItem.getProdId();
        holder.prodImagePath    = currentProductItem.getProdImagePath();
        holder.prodDesc         = currentProductItem.getProdDesc();
        holder.prodStock        = currentProductItem.getProdStock();
        holder.prodLowStock     = currentProductItem.getProdLowStock();
        holder.prodStockDate    = currentProductItem.getProdStockDate();
        holder.prodPackingQty   = currentProductItem.getProdPackingQty();
        holder.prodIsNew        = currentProductItem.getProdIsNew();
        holder.prodRate         = currentProductItem.getProdRate();
        holder.prodDisc         = currentProductItem.getProdDisc();
        holder.prodOfferDisc    = currentProductItem.getProdOfferDisc();

        holder.prodIsNewView.setVisibility(holder.prodIsNew == 1 ? View.VISIBLE : View.GONE);  

        String medium_path = holder.prodImagePath.isEmpty() ? "" : holder.prodImagePath.replace("product_image/", "product_image/medium/");
        aq.id(holder.prodImageView).image(medium_path, true, true, 0, R.drawable.no_image, BitmapFactory.decodeResource(getResources(), R.drawable.no_image), AQuery.FADE_IN);

        holder.prodImageView.setTag(holder);
        holder.prodImageView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(SelectProductActivity.this, FullScreenImagePreviewActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("position", position);
                intent.putExtra("items", productItemList);
                startActivity(intent);
            }
        });

        /**
         * CHECH WHETHER STOCK IS LESS THAN LOW_STOCK
         */
        if(holder.prodStock <= holder.prodLowStock && isParentNull)
        {
            /** Product Stock for changing with 'k' format if it is greater than 10000 */
            if(holder.prodLowStock > 999999)
                holder.prodStockView.setText(String.valueOf(holder.prodStock).substring(0,3)+"k+");
            else if(holder.prodStock > 99999)
                holder.prodStockView.setText(String.valueOf(holder.prodStock).substring(0,2)+"k+");
            else
                holder.prodStockView.setText(""+holder.prodStock);

            /**
             * Changing BGCOLOR 
             * if stock is less than 0 => red background 
             * else => green background
             */
            holder.prodStockView.setBackgroundResource(holder.prodLowStock <= 0 ? R.drawable.round_corner_red : R.drawable.round_corner_green);
            holder.prodStockView.setVisibility(View.VISIBLE);
        } else {
            holder.prodStockView.setVisibility(View.GONE);
        }

        String code = currentProductItem.getProdCode();
        code = (code.isEmpty() || code.equals("null")) ? "" : "["+code+"] ";
        holder.prodNameView.setText(code + "" +currentProductItem.getProdName());

        Log.w(TAG, "PACKING QTY : "+ holder.prodPackingQty);
        if(holder.prodPackingQty > 0) { //&& isParentNull) {
            holder.prodPackingQtyView.setText("Packing Qty: "+holder.prodPackingQty);
            holder.prodPackingQtyView.setVisibility(View.VISIBLE);
        }
        else 
            holder.prodPackingQtyView.setVisibility(View.INVISIBLE);

        holder.prodQtyView.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // TODO Auto-generated method stub
                if (!hasFocus) {
                    ViewHolder viewHolder = (ViewHolder) v.getTag();
                    saveData(viewHolder);
                }
            }
        });

        holder.prodQtyView.setTag(holder);
        holder.prodRateView.setTag(holder);
        holder.prodDiscView.setTag(holder);
        holder.prodOfferDiscView.setTag(holder);

        productQtyValue = 0.0;
        productRateValue = currentProductItem.getProdRate();
        productDiscountValue = currentProductItem.getProdDisc();
        productOfferDiscValue = currentProductItem.getProdOfferDisc();

        holder.prodRateView.setText(""+new BigDecimal((productRateValue - (productRateValue * (productDiscountValue + productOfferDiscValue) / 100))).setScale(2, RoundingMode.DOWN));

        /** First check whether value of Saved product Array is > 0 or not..*/
        ProductItems savedProdTemp = prodItemsSavedList.get(holder.prodId, null);

        if(savedProdTemp != null)
        {
            productQtyValue = savedProdTemp.getProdQty();
            holder.prodQtyView.setText(""+productQtyValue);
        } else {
            holder.prodQtyView.setText("");
        }

        amount = (productQtyValue * productRateValue) - ((productQtyValue * productRateValue) * ((productDiscountValue + productOfferDiscValue) / 100));

        if(productQtyValue > holder.prodStock && isParentNull) {
            holder.prodQtyView.setTextColor(Color.RED);
            holder.prodQtyView.setBackgroundResource(R.drawable.edittextred_edit_text_holo_light);
        }
        else {
            holder.prodQtyView.setTextColor(Color.BLACK);
            holder.prodQtyView.setBackgroundResource(R.drawable.myactionbar_edit_text_holo_dark);
        }

        holder.prodAmountView.setText("Rs." + new BigDecimal(amount).setScale(2, RoundingMode.CEILING));

        return convertView;
    }

    public class ViewHolder {
        int prodId;
        String prodImagePath;
        String prodDesc;
        double prodRate;
        double prodDisc;
        double prodOfferDisc;
        double prodStock;
        double prodLowStock;
        String prodStockDate;
        double prodPackingQty;
        int prodIsNew;

        ImageView prodIsNewView;
        ImageView prodImageView;
        TextView prodNameView;
        TextView prodStockView;
        EditText prodQtyView;
        TextView prodRateView;
        TextView prodDiscView;
        TextView prodOfferDiscView;

        TextView prodOriginalRateView;
        TextView prodAmountView;
        TextView prodPackingQtyView;
        TextView prodPriceTagView;

        LinearLayout layoutDiscountView;

        LinearLayout priceLayoutView1;
        LinearLayout priceLayoutView2;      
    }
}

产品select_product.xml的活动布局

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/productParentView"
    android:layout_width="fill_parent"
    android:layout_height="match_parent" >

    <Spinner
        android:id="@+id/categorySpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:prompt="@string/prompt_select_category" />

    <ListView
        android:id="@+id/productList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/categorySpinner"
        android:layout_margin="5dp"
        android:descendantFocusability="afterDescendants" 
        android:focusable="false"
        android:layout_marginBottom="10dp"
        android:fastScrollEnabled="true" >
    </ListView>

    <TextView
        android:id="@+id/productIfNoAvailable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="@string/error_no_products_available_for_this_category"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@android:color/holo_red_dark"
        android:visibility="gone" />

</RelativeLayout>

list_product_variant_heading_view.xml ()()中使用的标题行XML

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/productVariantHeadingRelativeLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:background="@drawable/bg_white_shadow"
    android:gravity="center_horizontal"
    android:padding="3dp" >

    <RelativeLayout
        android:id="@+id/layoutProductNameStock"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        <RelativeLayout
            android:id="@+id/productNameLayoutInnerForClick"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_toLeftOf="@+id/productIsNewImageView"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/productNameTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/product_name"
                android:textColor="@android:color/black"
                android:textSize="@dimen/product_name_text_size" />
        </RelativeLayout>

        <ImageView
            android:id="@+id/productIsNewImageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginLeft="5dp"
            android:contentDescription="@string/app_name"
            android:src="@drawable/new_icon" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/productRowViewLinearLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/layoutProductNameStock"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

产品行的SubLayouts是从以下文件创建的。

列表

列表

注意到:当键盘打开时,视图正在刷新,并且失去了编辑文本的焦点。这就是为什么键盘将视图从numeric更改为alphabetic的原因。我用android:windowSoftInputMode="stateAlwaysHidden"android:configChanges="keyboardHidden|orientation"改变了android:windowSoftInputMode="stateAlwaysHidden"android:configChanges="keyboardHidden|orientation",但不是为我工作。

你的帮助将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2016-05-25 06:17:27

这是由于listview循环机制造成的。谷歌安卓()集团已经提出了这个问题。最好是将数量项目放在结帐处,或将编辑改为下拉式,在下拉式中给出数字。

EditTexts在ListView (安卓)中聚焦的问题

https://code.google.com/p/android/issues/detail?id=31165

编辑它很好地使用了这个选项:

代码语言:javascript
复制
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
票数 2
EN

Stack Overflow用户

发布于 2015-05-12 10:50:18

在代码中添加这一行:

代码语言:javascript
复制
input.setRawInputType(Configuration.KEYBOARD_12KEY);

这将只显示数字键盘。看看这个..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30122027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档