Android - Unexpected Behavior of Keypad - EditText in ListView
Asked Answered
P

2

3

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

Product View

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)

enter image description here

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

enter image description here

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.

Peaked answered 8/5, 2015 at 10:52 Comment(9)
have you try to set this two : android:descendantFocusability="afterDescendants" and android:focusable="false" propertiest to ListView ?Contagious
Not working. I tried. same output.Peaked
@MuhammadBabar Edited. Check itPeaked
i mean R.layout.list_product_view_catalog and R.layout.list_product_view. the links you shared are not workingWheelhouse
Its working perfectly here. can you check it once.?Peaked
The requested URL /3ic89jxr was not found on this server.Wheelhouse
Yes i guess so. Please add the files with your question.Wheelhouse
I don't see any edit text in above posted layouts?Wheelhouse
I have the same problem! @PratikButani any solution yet?Spokeswoman
P
2

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"
Pilarpilaster answered 25/5, 2016 at 6:17 Comment(0)
V
0

Add this line on your code:

input.setRawInputType(Configuration.KEYBOARD_12KEY);

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

Vivie answered 12/5, 2015 at 10:50 Comment(2)
Its not working for me. Actually My View is refreshing and losing focus from edittext when keypad is open. that's why keypad is changing view from numeric to alphabetic.Peaked
@PratikButani did u find any solution for that..Im also facing that issue..Terris

© 2022 - 2024 — McMap. All rights reserved.