Reputation: 379
I have a list view, when a button on the ListView is click it should change the text of TextView that is outside the ListView.
I tried:
initializing the TextView inside the ViewHolder
and having a function in the main Class that would be call when the button in the ListView is click.
Whichever approach, I get a null reference on the button.
public class ItemOrderActivity : BaseActivity <ItemOrderViewModel>
{
TextView estimatedTotal;
Button continueButton;
ListView itemList;
int count = 0;
static public int[] itemCount = new int[8] { 0, 0, 0, 0, 0, 0, 0, 0 };
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Setting layout
SetContentView (Resource.Layout.ItemOrderLayout);
estimatedTotal = FindViewById<TextView> (Resource.Id.estimatedTotal);
// Initializing button view items
continueButton = FindViewById<Button> (Resource.Id.continueButton);
garmentList = FindViewById<ListView> (Resource.Id.itetListView);
ItemListAdapter adapter = new ItemListAdapter(this, getItems());
itemList.Adapter = adapter;
// Button event for OnContinue
continueButton.Click += OnContinue;
}
void total()
{
estimatedTotal.Text = "tet";
}
private class ItemListAdapter : BaseAdapter<Item>
{
private Activity activity;
public List<Item> data;
public ItemListAdapter(Activity activity, List<Item> data)
{
this.activity = activity;
this.data = data;
}
public override Item this[int position]
{
get { return this.data [position]; }
}
public override int Count
{
get { return this.data.Count(); }
}
public override long GetItemId(int position)
{
return 0;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
Holder holder;
holder = new Holder ();
if (convertView == null)
{
convertView = this.activity.LayoutInflater.Inflate (Resource.Layout.ItemLayout, null);
//holder = new Holder ();
holder.Initialize (convertView);
convertView.Tag = holder;
}
//convertView.Tag = holder;
Item item = this.data [position];
holder = (Holder)convertView.Tag;
holder.Bind (this.activity, item.itemName, position);
return convertView;
}
public class Holder : Java.Lang.Object
{
public TextView ItemName;
public Button removeItem;
public Button addItem;
public TextView itemQty;
public int pos;
//TextView estimatedTotal;
public void Initialize(View view)
{
itemName = view.FindViewById<TextView> (Resource.Id.itemTextView);
itemGarment = view.FindViewById<Button> (Resource.Id.removeItemButton);
itemGarment = view.FindViewById<Button> (Resource.Id.addItemButton);
itemQty = view.FindViewById<TextView> (Resource.Id.ItemQtyTextView);
//estimatedTotal = view.FindViewById<TextView> (Resource.Id.estimatedTotal);
addItem.Click += addItemClick;
removeItem.Click += removeItemClick;
}
public void Bind(Activity context, string gn, int position)
{
garmentName.Text = gn;
garmentQty.Text = ItemOrderActivity.ItemCount[position].ToString();
pos = position;
}
public void addButtonClick(object sender, EventArgs e)
{
poa.addItem (pos);
ItemOrderActivity.itemCount [pos]++;
itemQty.Text = ItemOrderActivity.itemCount [pos].ToString ();
//estimatedTotal.Text = "test";
poa.total();
}
}
}
Upvotes: 0
Views: 737
Reputation: 1999
Your way of getting callback from button is wrong. To do this: Create an event in your adapter for button click. When you want to set listview adapter, add a callback to your event that changes textview text. Inside your GetView or in your binder (or wherever you bind your view), add handler of the event to your button click event. so in your activity:
protected override void OnCreate (Bundle bundle)
{
//Anything before it
ItemListAdapter adapter = new ItemListAdapter(this, getItems());
adapter.ItemButtonClick += delegate {//Anything you want to do};
itemList.Adapter = adapter;
}
and your adapter:
private class ItemListAdapter : BaseAdapter<Item>
{
//Anything
public override View GetView(int position, View convertView, ViewGroup parent)
{
//Your code for initializing
if(ItemButtonClick!=null)
theButton.Click += ItemButtonClick;
}
public event EventHandler ItemButtonClick;
}
Upvotes: 1