set button onclick event for every row of listview
16,965
Solution 1
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;
}
}
Solution 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;
}
Author by
samira
Updated on June 05, 2022Comments
-
samira almost 2 years
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.
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); } }