2

i populate listview via json parsing using AsyncTask. in every row of list view i have a button. i want to write onclickLister for them.

enter image description here

i want, when i click add to cart the data of name and price and quantity save to sqlite.

public void addtocart(){
        Button btnaddtocart=(Button)findViewById(R.id.btnInsertToCart);
        final TextView tname=(TextView)findViewById(R.id.nameNewItem);
        final EditText eqty=(EditText)findViewById(R.id.updateQty);
        final TextView tprice=(TextView)findViewById(R.id.priceNewItem);

        btnaddtocart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    if(eqty.getText().toString().equalsIgnoreCase("")){
                        Toast.makeText(getApplicationContext(),"Please enter the Quantity.",Toast.LENGTH_LONG).show();
                    }
                    else { SQLiteDatabase database = openOrCreateDatabase("ORCL", MODE_PRIVATE, null);
                        database.execSQL("CREATE TABLE IF NOT EXISTS CART(id integer primary key autoincrement,title VARCHAR(150),qty INT(10),price INT(10));");
                        database.execSQL("INSERT INTO CART(title,qty,price) VALUES('" + tname.getText().toString() + "'," + Integer.parseInt(eqty.getText().toString())+","
                                + Integer.parseInt(tprice.getText().toString())+");");

                        database.close();
                        eqty.setText(null);

                        //hide keyboard
                        InputMethodManager imm = (InputMethodManager)getSystemService(
                                Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(eqty.getWindowToken(), 0);

                        Toast.makeText(getApplicationContext(),"Add to Cart",Toast.LENGTH_LONG).show();}

                }
                catch (Exception ex){
                    Toast.makeText(getApplicationContext(),ex.getMessage(),Toast.LENGTH_LONG).show();
                }
            }
        });

but my question is i should write codes which part of following code:

public class Update extends Activity {
    ListView list;
    Button Btngetdata;
    ProgressDialog pDialog;
    ArrayList<HashMap<String, String>> newItemlist = new ArrayList<HashMap<String, String>>();
    private static final String TAG_ITEM = "NewItem";
    private static final String TAG_NAME = "name";
    private static final String TAG_DESCRIPTION = "description";
    private static final String TAG_PRICE = "price";
    ConnectionDetector cd;
    Boolean isInternetPresent = false;
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.updateapp);
        pDialog = new ProgressDialog(Update.this);
        pDialog.setMessage("Getting Data ...");

        newItemlist = new ArrayList<HashMap<String, String>>();
        Btngetdata = (Button)findViewById(R.id.getdata);
        cd = new ConnectionDetector(getApplicationContext());
        Btngetdata.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isInternetPresent = cd.isConnectingToInternet();
                if (isInternetPresent) {
                new JSONParse().execute();   }
                else {
                    Toast.makeText(getApplicationContext(),"You don't have internet connection.",Toast.LENGTH_LONG).show();
                }

            }
        });


    }
    private class JSONParse extends AsyncTask<String, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog.show();
        }
        @Override
        protected Void doInBackground(String... args) {
            try {
                Log.i("...............", "Hello..............");
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpGet httpPost = new HttpGet("http://www.karocellen.com/newItem.json");
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                String jsonstring = EntityUtils.toString(httpEntity);
                Log.i("...............",jsonstring);
                JSONObject json = new JSONObject(jsonstring);
                JSONArray newitem = json.getJSONArray(TAG_ITEM);
                for(int i = 0; i < newitem.length(); i++){
                    JSONObject c = newitem.getJSONObject(i);
                    String name = c.getString(TAG_NAME);
                    String description = c.getString(TAG_DESCRIPTION);
                    String  price = c.getString(TAG_PRICE);
                    Log.i("...............",name);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(TAG_NAME, name);
                    map.put(TAG_DESCRIPTION, description);
                    map.put(TAG_PRICE, price);
                    newItemlist.add(map);
                }

            }   catch (Exception ex){


            }
            return null;

        }
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            pDialog.dismiss();
            list=(ListView)findViewById(R.id.listupdate);
            ListAdapter adapter = new SimpleAdapter(Update.this, newItemlist,
                    R.layout.updateapprow,
                    new String[] { TAG_NAME,TAG_DESCRIPTION, TAG_PRICE }, new int[] {
                    R.id.nameNewItem,R.id.descriptionNewItem, R.id.priceNewItem});
            list.setAdapter(adapter);              

    }
    }
6
  • I would use a custom adapter. Where are the buttons in your code? Commented Dec 14, 2013 at 17:45
  • @Raghunandan, nowhere. i don't know where to define them. Commented Dec 14, 2013 at 17:48
  • do a google search for custom adapter. Commented Dec 14, 2013 at 17:49
  • 1
    what you mean by out of asynctask. In custoom adapter you will infalte a custom layout and update ui which is should be done on the ui thread Commented Dec 14, 2013 at 17:53
  • 1
    try the code snippet in my post. does it work?? Commented Dec 14, 2013 at 18:29

2 Answers 2

4

Use a CustomAdapter.

You need to understand how listview works

How ListView's recycling mechanism works

Pass the activity context and the list NewItems to the constructor of the custom adapter.

   @Override
   protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            pDialog.dismiss();
            list=(ListView)findViewById(R.id.listupdate);
            CustomAdapter cus = new CustomAdapter(MainActivtiy.this,newItemlist); 
            list.setAdapter(cus);              

    }

Use a Custom Layout with textviews and buttons. Name it list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="33dp"
        android:layout_marginTop="40dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView2"
        android:layout_marginLeft="34dp"
        android:layout_toRightOf="@+id/textView2"
        android:text="TextView" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView3"
        android:layout_marginTop="20dp"
        android:text="Button" />

</RelativeLayout>

Inflate the layout, initialize and update the views. Set Listener on the button do what is required.

  public class CustomAdapter extends BaseAdapter
    {
        LayoutInflater mInlfater;
        ArrayList<HashMap<String,String>> list;
        public CustomAdapter(Context context,ArrayList<HashMap<String,String>> list) 
        {
             mInlfater = LayoutInflater.from(context);
             this.list =list;
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return 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
            ViewHolder holder;
            if(convertView ==null)
            {
                convertView = mInlfater.inflate(R.layout.list_item,false);
                holder = new ViewHolder();
                holder.b1 = (Button)convertView.findViewById(R.id.button1);
                holder.tv1 = (TextView)convertView.findViewById(R.id.textView1);
                holder.tv2 = (TextView)convertView.findViewById(R.id.textView2);
                holder.tv3 = (TextView)convertView.findViewById(R.id.textView3);
                convertView.setTag(holder);

            }
            else
            {
                holder =(ViewHolder) convertView.getTag();
            }
            HashMap<String,String> map = list.get(position);
            holder.tv1.setText(map.get("name"));
                holder.tv2.setText(map.get("description"));
                holder.tv3.setText(map.get("price"));
                holder.b1.setOnClickListener(new OnClickListener()
                {

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

                }


               });
            return convertView;
        }
        static class ViewHolder
        {
            Button b1;
            TextView tv1,tv2,tv3;
        }
    } 
Sign up to request clarification or add additional context in comments.

2 Comments

How to get item name on Button Click ? Can't use position as it's not final, and if declare it as final all items will be the same !
@MahdiRafatjah you can use set Tag with button and get the same in onCLick using view v. by the way you should use recycelrview instead of listview
2

You have to set the listener inside getView of your CustomAdapter. Here is an example below

public class ListAdapter extends ArrayAdapter<Item> {
private List<Item> items;
public ListAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);    
}

public ListAdapter(Context context, int resource, List<Item> items) {
    super(context, resource, items);
    this.items = items;
}

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

    View v = convertView;
    if (v == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.itemlistrow, null); // your rowlayout

    }

     // suppose a button id in rawlayout is btn1
     Button btn1 = (Button) v.findViewById(R.id.btn);
     btn.setOnClicListener(listener);

    return v;

}

2 Comments

he does not a custom adapter.
And also this (vogella.com/articles/AndroidListView/article.html) resource can help you to understand how adapter works

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.