Android - Unexpected Behavior of Keypad - EditText in ListView

无人久伴 提交于 2019-12-06 08:22:42

问题


I am stuck with problem since last two days i.e. i have created ListView with Custom View with Variant SubLayout like:

Problems:

  • When i click on EditText of Qty, its displaying Soft Input Keyboard with Numeric Keypad and immediately focus lost from
    edittext with change of alphabetic keypad. (First ScreenShot Below)

  • on Second time focus of EditText its works fine and taking numeric values but while scrolling its change keypad from numeric to alphabetic. (Second ScreenShot Below)

Actually i can understand problem is what that It is changing on showing/hiding keyboard and because of that view is updating every time so what can i do for keep focusing on EditText or prevent to Refresh Views on Show/Hide Keyboard.

My Adapter Code is:

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

Activity Layout of Product select_product.xml:

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

Heading Row XML which is used in getView() list_product_variant_heading_view.xml

<?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 of that Product Row is Creating from following files.

list_product_variant_single_row_view.xml

list_product_variant_multiple_row_view.xml

Noticed: View is refreshing and losing focus from edittext when keypad is open. that's why keypad is changing view from numeric to alphabetic. I have changed AndroidManifest.xml with android:windowSoftInputMode="stateAlwaysHidden" and android:configChanges="keyboardHidden|orientation" but not working for me.

Your Help would be appreciated.


回答1:


This is due to the listview recycle mechanism. Already the issue is raised in google android groups. It is better to place quantity items at check out or change edittext to drop downs by giving numbers in dropdowns.

Issues focusing EditTexts in a ListView (Android)

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

EDIT It is working perfectly with this option:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"



回答2:


Add this line on your code:

input.setRawInputType(Configuration.KEYBOARD_12KEY);

this will show only the numeric keyboard. check this..



来源:https://stackoverflow.com/questions/30122027/android-unexpected-behavior-of-keypad-edittext-in-listview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!