EditText in GridView : How to get value from Multiple EditText
Asked Answered
H

2

4

I have created GridView using following XML code:

grid_layout.xml

<GridView
    android:id="@+id/productList"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="5dp"
    android:layout_marginBottom="10dp"
    android:drawSelectorOnTop="true"
    android:fastScrollEnabled="true"
    android:horizontalSpacing="10dp"
    android:listSelector="@drawable/list_view_selector"
    android:numColumns="3"
    android:stretchMode="columnWidth"
    android:verticalSpacing="10dp" >
</GridView>

<!-- android:listSelector="@drawable/list_view_selector" is not affecting -->

and I have bound that GridView with the following layout:

grid_inner_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/productChildView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:background="@drawable/login_bg"
    android:gravity="center"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/productImage"
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:layout_alignLeft="@+id/productName"
        android:layout_alignRight="@+id/productName"
        android:contentDescription="@string/date_desc"
        android:src="@drawable/ic_date" />

    <TextView
        android:id="@+id/productName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/productImage"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:ellipsize="marquee"
        android:gravity="center_horizontal"
        android:singleLine="true"
        android:text="@string/product_name"
        android:textColor="@android:color/black"
        android:textSize="@dimen/list_item_text_size" />

    <LinearLayout
        android:id="@+id/productEditTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/productName" >

        <EditText
            android:id="@+id/productRateValue"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/edit_text_holo_light"
            android:gravity="right"
            android:hint="@string/hint_rate"
            android:inputType="number"
            android:nextFocusRight="@+id/productDiscountValue"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@android:color/black" >
        </EditText>

        <EditText
            android:id="@+id/productDiscountValue"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/edit_text_holo_light"
            android:gravity="right"
            android:hint="@string/hint_disc"
            android:inputType="number"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@android:color/black" />
    </LinearLayout>

    <EditText
        android:id="@+id/productQuantityValue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/productEditTextView"
        android:layout_marginRight="5dp"
        android:background="@drawable/edit_text_holo_light"
        android:gravity="right"
        android:hint="@string/hint_quantity"
        android:inputType="number"
        android:nextFocusRight="@+id/productRateValue"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@android:color/black" >

        <requestFocus />
    </EditText>

</RelativeLayout>

and i got finally this view:

Preview Image

my Adapter Class is like:

public class MyGridViewAdapter extends SimpleCursorAdapter {

    Cursor cursor;

    double productRateValue;
    double productDiscountValue;

    ImageLoader mImageLoader = new ImageLoader(context);

    public MyGridViewAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
        // TODO Auto-generated constructor stub
        //get reference to the row
        this.cursor = c;

    }

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

        View view = convertView;  
        ViewHolder holder;

        if(convertView == null)
        {
            //get reference to the row
            view = super.getView(position, convertView, parent); 

            holder = new ViewHolder();

            productRateValue = cursor.getDouble(productCursor.getColumnIndex("rate"));
            productDiscountValue = cursor.getDouble(productCursor.getColumnIndex("discount"));

            //*** Image ***//
            holder.prodImage = (ImageView) view.findViewById(R.id.productImage);
            String path = productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_IMAGES));
            mImageLoader.DisplayImage(path, holder.prodImage);

            holder.prodName = (TextView) view.findViewById(R.id.productName);
            holder.prodName.setText(productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_NAME)));

            holder.prodQty = (EditText) view.findViewById(R.id.productQuantityValue);
            holder.prodQty.setText("");

            holder.prodRate = (EditText) view.findViewById(R.id.productRateValue);
            holder.prodRate.setText(String.valueOf(productRateValue));

            holder.prodDisc = (EditText) view.findViewById(R.id.productDiscountValue);
            holder.prodDisc.setText(String.valueOf(productDiscountValue));

            holder.prodRate.setFocusable(isRateEditable);
            holder.prodRate.setEnabled(isRateEditable);

            holder.prodDisc.setFocusable(isDiscountEditable);
            holder.prodDisc.setEnabled(isDiscountEditable);

            /* For set Focus on Next */
            if(isRateEditable)
                holder.prodQty.setNextFocusDownId(R.id.productRateValue);
            else if(isDiscountEditable)
                holder.prodQty.setNextFocusDownId(R.id.productDiscountValue);

            if(isDiscountEditable)
                holder.prodRate.setNextFocusDownId(R.id.productDiscountValue);

            holder.prodDisc.setNextFocusDownId(R.id.productQuantityValue);

            view.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) view.getTag();
        }

        return view;  
    }

    public class ViewHolder{
        ImageView prodImage;
        TextView prodName;  
        EditText prodRate;
        EditText prodQty;
        EditText prodDisc;
    }
}

Now my question is when I click on ORDER Tab, I want to save all the data in which "Quantity" is entered, I have override onPause() and onStop() method to call saveData() but what can I do in saveData() method

as per my view i want to create JSONObject and store all value as an Array of JSON.

Please Help...

Thanks in advance...

Hannan answered 5/10, 2013 at 9:49 Comment(5)
Post your code for adapter atleast getView() method here..Vocable
Can you use JsonObject in place of cursor and set vaule for griditem by it's position?Vocable
No, this data is coming from Database. i have just think that couple of data is send to next Activity using JSONObjectHannan
so we can use addTextChangedListener with holder.prodQty and set edited text in the same jsonobject.Vocable
Yes, that i have implemented, but when i am back again on this Tab,i have to set that Quantity.Hannan
H
1

With My Question i am success to save data in JSONArray but got Again This Problem

and Finally i found solution:

I have used BaseAdapter instead of SimpleCursorAdapter

MyGridViewAdapter.java

class MyGridViewAdapter extends BaseAdapter {

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

    ViewHolder holder;

    ImageLoader mImageLoader;

    int concatid;

    String productQtyValue;
    Double productRateValue;
    Double productDiscountValue;

    int tempId = 0;

    public MyGridViewAdapter(ArrayList<ProductItems> productItemsList) {
        // TODO Auto-generated constructor stub
        this.productItemList = productItemsList;
        mImageLoader = new ImageLoader(context);
        inflater =(LayoutInflater) getActivity().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(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View view = convertView;

        if(convertView == null)
        {
            view = inflater.inflate(R.layout.list_product_view, null);
            holder = new ViewHolder();

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

        ProductItems currentProductItem = productItemList.get(position);

        holder.prodId = currentProductItem.getProdId();
        holder.prodImagePath = currentProductItem.getProdImagePath();
        holder.prodDesc = currentProductItem.getProdDesc();
        
        //Image
        holder.prodImage = (ImageView) view.findViewById(R.id.productImage);
        mImageLoader.DisplayImage(holder.prodImagePath, holder.prodImage);
        holder.prodImage.setTag(holder);

        holder.prodImage.setOnClickListener(new OnClickListener() {

            @SuppressWarnings("deprecation")
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                ViewHolder tempHolder = (ViewHolder)v.getTag();
                
                AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
                alertDialog.setTitle(tempHolder.prodName.getText());
                LayoutInflater inflater = getActivity().getLayoutInflater();
                
                // Inflate and set the layout for the dialog
                // Pass null as the parent view because its going in the dialog
                // layout
                View view = inflater.inflate(R.layout.custom_image, null);

                ImageView image = (ImageView) view.findViewById(R.id.dialogImageView);
                mImageLoader.DisplayImage(tempHolder.prodImagePath, image);
                
                ((TextView)view.findViewById(R.id.dialogTextViewDesc)).setText(tempHolder.prodDesc);

                alertDialog.setView(view);

                alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // here you can add functions
                        dialog.dismiss();
                    }
                });

                alertDialog.show();
            }
        });

        holder.prodName = (TextView) view.findViewById(R.id.productName);
        holder.prodName.setText(currentProductItem.getProdName());

        holder.prodQty = (EditText) view.findViewById(R.id.productQuantityValue);
        holder.prodQty.setTag(holder);

        holder.prodQty.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.prodRate = (EditText) view.findViewById(R.id.productRateValue);
        holder.prodRate.setTag(holder);

        holder.prodDisc = (EditText) view.findViewById(R.id.productDiscountValue);
        holder.prodDisc.setTag(holder);

        /** First check whether value of Saved product Array is >0 or not..*/
        Log.d("msg", "Saved Prod : "+allProductArray.length());
        if(allProductArray.length() <= 0)
        {
            productRateValue = currentProductItem.getProdRate();
            productDiscountValue = currentProductItem.getProdDisc();
        }

        /* Filling up value if previously entered... */
        for (int array = 0; array < allProductArray.length(); array++) {
            try {
                if(allProductArray.getJSONObject(array).getInt("prodid") == holder.prodId)
                {
                    productRateValue = allProductArray.getJSONObject(array).getDouble("rate");
                    productDiscountValue = allProductArray.getJSONObject(array).getDouble("discount");
                    productQtyValue = allProductArray.getJSONObject(array).getString("qty");
                    holder.prodQty.setText(String.valueOf(productQtyValue));
                    break;
                }else
                {
                    productRateValue = currentProductItem.getProdRate();
                    productDiscountValue = currentProductItem.getProdDisc();

                    holder.prodQty.setText("");
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                Log.e("msg", "JSON error in bindView : " + e.getMessage());
            }
        }

        //holder.prodQty.setText("");
        holder.prodRate.setText(String.valueOf(productRateValue));
        holder.prodDisc.setText(String.valueOf(productDiscountValue));

        holder.prodRate.setFocusable(isRateEditable);
        holder.prodRate.setEnabled(isRateEditable);

        holder.prodDisc.setFocusable(isDiscountEditable);
        holder.prodDisc.setEnabled(isDiscountEditable);

        // For set Focus on Next
        if(isRateEditable)
            holder.prodQty.setNextFocusDownId(R.id.productRateValue);
        else if(isDiscountEditable)
            holder.prodQty.setNextFocusDownId(R.id.productDiscountValue);

        if(isDiscountEditable)
            holder.prodRate.setNextFocusDownId(R.id.productDiscountValue);

        holder.prodDisc.setNextFocusDownId(R.id.productQuantityValue);

        int catid = currentProductItem.getProdId();
        concatid = Integer.parseInt(catid + "" + tempId++);

        Log.d("msg", "Inner Concat ID :"+concatid);

        view.setId(concatid);
        view.setTag(holder);

        return view;
    }

    public class ViewHolder{
        int prodId;
        String prodImagePath;
        String prodDesc;
        ImageView prodImage;
        TextView prodName;
        EditText prodRate;
        EditText prodQty;
        EditText prodDisc;
    }
}

I have converted Cursor in to ArrayList<ProductItems>:

if (!dbHelper.db.isOpen())
dbHelper.open();

productCursor = dbHelper.getProduct(companyid, categoryid, isDistributor);

//                  String[] cols = new String[] { DatabaseHelper.PRODUCT_IMAGES, DatabaseHelper.PRODUCT_NAME, "rate", "discount"};
//                  int[]   views = new int[] { R.id.productImage, R.id.productName, R.id.productRateValue, R.id.productDiscountValue};

Log.d("msg", "Count of Product : "+productCursor.getCount());

prodItemsArrayList.clear();

if (productCursor != null && productCursor.getCount() > 0) {

    ProductItems items;

    for(productCursor.moveToFirst(); !productCursor.isAfterLast(); productCursor.moveToNext())
    {
        items = new ProductItems();

        items.setProdId(productCursor.getInt(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_SERVER_ID)));
        items.setProdName(productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_NAME)));
        items.setProdImagePath(productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_IMAGES)));
        items.setProdQty("");
        items.setProdRate(productCursor.getDouble(productCursor.getColumnIndex("rate")));
        items.setProdDisc(productCursor.getDouble(productCursor.getColumnIndex("discount")));
        items.setProdDesc(productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_DESC)).equals("null") ? "" : productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_DESC)));

        prodItemsArrayList.add(items);
    }

    //Now create an array adapter and set it to display using our row
    //passing cursor with zero rows and displaying error message
    adapter = new MyGridViewAdapter(prodItemsArrayList);
    adapter.notifyDataSetChanged();
    productTable.setAdapter(adapter);

    /* HIDE ERROR MSG */
    (view.findViewById(R.id.productIfNoAvailable)).setVisibility(View.GONE);
} else {
    /* SHOW ERROR MSG */
    (view.findViewById(R.id.productIfNoAvailable)).setVisibility(View.VISIBLE);
    adapter.notifyDataSetChanged();
    adapter.notifyDataSetInvalidated();
}

Any Suggestion would be Appreciated :)

Thanks...

Hannan answered 12/10, 2013 at 6:4 Comment(0)
V
0

Do this way..

JSONObject output = new JSONObject();

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

    View view = convertView;
    ViewHolder holder;

    if (convertView == null) {
        // get reference to the row
        view = super.getView(position, convertView, parent);

        holder = new ViewHolder();
        holder.prodImage = (ImageView) view.findViewById(R.id.productImage);
        holder.prodName = (TextView) view.findViewById(R.id.productName);
        holder.prodQty = (EditText) view.findViewById(R.id.productQuantityValue);
        holder.prodRate = (EditText) view.findViewById(R.id.productRateValue);
        holder.prodDisc = (EditText) view.findViewById(R.id.productDiscountValue);

        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    productRateValue = cursor.getDouble(productCursor.getColumnIndex("rate"));
    productDiscountValue = cursor.getDouble(productCursor.getColumnIndex("discount"));
    String path = productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_IMAGES));
    mImageLoader.DisplayImage(path, holder.prodImage);

    holder.prodName.setText(productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_NAME)));
    holder.prodQty.setText("");
    holder.prodRate.setText(String.valueOf(productRateValue));
    holder.prodDisc.setText(String.valueOf(productDiscountValue));
    holder.prodRate.setFocusable(isRateEditable);
    holder.prodRate.setEnabled(isRateEditable);
    holder.prodDisc.setFocusable(isDiscountEditable);
    holder.prodDisc.setEnabled(isDiscountEditable);

    /* For set Focus on Next */
    if (isRateEditable)
        holder.prodQty.setNextFocusDownId(R.id.productRateValue);
    else if (isDiscountEditable)
        holder.prodQty.setNextFocusDownId(R.id.productDiscountValue);

    if (isDiscountEditable)
        holder.prodRate.setNextFocusDownId(R.id.productDiscountValue);

    holder.prodDisc.setNextFocusDownId(R.id.productQuantityValue);
    holder.prodQty.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            output.put(productCursor.getString(productCursor.getColumnIndex(DatabaseHelper.PRODUCT_NAME)),s);
        }
    });
    return view;
}

public class ViewHolder {
    ImageView prodImage;
    TextView prodName;
    EditText prodRate;
    EditText prodQty;
    EditText prodDisc;
}

you will get output jsonobject with prodname and it's entered qty here.

Vocable answered 5/10, 2013 at 12:4 Comment(2)
It seems better approach, but still I feel there is an error. How would you make sure that you are accessing cursor value from the correct index in afterTextChanged() callback?Tarter
yes you are right. we can get data of product by using query to database and store it in form of ArrayList<HashMap<String,String>>. then it will be so easy to maintain index as well.Vocable

© 2022 - 2024 — McMap. All rights reserved.