Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
423 views
in Technique[技术] by (71.8m points)

android - Unable to get listView.ItemClick to be called in MonoDroid

I have the following code:

protected override void OnCreate (Bundle bundle)
{
    progress = ProgressDialog.Show(this, "", "Loading...");
    progress.SetProgressStyle(ProgressDialogStyle.Spinner);

    base.OnCreate (bundle);

    //Set the Activity's view to our list layout        
    SetContentView(Resource.Layout.LawsAndRegsList);

    new Thread(new ThreadStart(() => {
        //Create our adapter
        listAdapter = new LawsAndRegsListAdapter(this);
        this.RunOnUiThread ( () => {
            //Find the listview reference
            listView = FindViewById<ListView>(Resource.Id.listView);

            //Hook up our adapter to our ListView
            listView.Adapter = listAdapter;

            //Wire up the click event
            //listView.ItemClick += new EventHandler<ListView.ItemClickEventArgs>(listView_ItemClick);
            listView.ItemClick += listView_ItemClick;

            listAdapter.NotifyDataSetChanged(); 

            progress.Dismiss();
        });
    })).Start();
}

void listView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
    //Get our item from the list adapter
    var item = this.listAdapter.GetItemAtPosition(e.Position);

    //Make a toast with the item name just to show it was clicked
    Toast.MakeText(this, item.Name + " Clicked!", ToastLength.Short).Show();
}

Can anyone tell me why the ItemClick would not get called?

It looks like what I have read and examples I have seen so what am I doing wrong? thanks for the help.

UPDATE:

Here are the two layouts I have:

LawsAndRegsList:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget28"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/topLevelMenuBackground"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btnAddExpense"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="@string/ButtonHome"
            android:layout_centerVertical="true" />
        <TextView
            android:id="@+id/lblExpenseCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="15dp"
            android:text="@string/LawsAndRegs"
            android:textColor="#ffffffff"
            android:textSize="20sp"
            android:layout_centerVertical="true" />
    </RelativeLayout>
    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

LawsAndRegsListItem:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget28"
    android:layout_width="fill_parent"
    android:background="@drawable/topLevelMenuCellBackground"
    android:layout_height="40px">
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/imageItem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_centerVertical="true"
            android:layout_gravity="center_vertical" />
        <TextView
            android:id="@+id/textTop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:textColor="#111479"
            android:text="hello"
            android:layout_toRightOf="@+id/imageItem"
            android:textStyle="bold"
            android:layout_marginLeft="10dp" />
        <ImageButton
            android:src="@drawable/OrangeAccessoryButton"
            android:layout_width="wrap_content"
            android:layout_height="25dp"
            android:layout_alignParentRight="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="15dp"
            android:layout_centerVertical="true"
            android:id="@+id/imageButton1"
            android:background="@android:color/transparent" />
    </RelativeLayout>
</LinearLayout>

UPDATE #2:

Added my LIstAdapter code:

public class LawsAndRegsListAdapter : BaseAdapter { Activity context;

public List<LawsAndRegs> items;

public LawsAndRegsListAdapter (Activity context) //We need a context to inflate our row view from
{
    this.context = context;

    MY_SEB_SERVICE_ContentWS.ContentWS contentWS = new MY_WEB_SERVICE_ContentWS.ContentWS ();
    string sMenu = contentWS.GetMenuXML (146, 1, "", 0, 1033);

    XmlRootAttribute r = new XmlRootAttribute ("Item");
    var ser = new XmlSerializer (typeof(Item), r);
    StringReader stringReader;
    stringReader = new StringReader (sMenu);
    Item obj = (Item)ser.Deserialize (stringReader);
    ItemMenuItem[] m = obj.Menu.Item;
    ItemMenuItem larMenu = null;
    foreach (ItemMenuItem mnu in m)
    {
        if (mnu.ItemID == 155)
        {
            if (this.items == null)
                this.items = new List<LawsAndRegs> ();
            larMenu = mnu;
            break;
        }
    }

    if (larMenu != null)
    {
        foreach (ItemMenuItemMenuItem imimi in larMenu.Menu.Item)
        {
            LawsAndRegs lar = new LawsAndRegs();
            lar.Name = (string)imimi.Items[2];
            lar.Image = (string)imimi.Items[3];
            this.items.Add (lar);
        }
    }
}

public override int Count
{
    get { return items.Count; }
}

public override Java.Lang.Object GetItem(int position)
{
    return position;
}

public override long GetItemId(int position)
{
    return position;
}

public LawsAndRegs GetItemAtPosition(int position)
{
    return items[position];
}

public override View GetView(int position, View convertView, ViewGroup parent)
{
    //Get our object for this position
    var item = items[position];         

    //Try to reuse convertView if it's not  null, otherwise inflate it from our item layout
    // This gives us some performance gains by not always inflating a new view
    // This will sound familiar to MonoTouch developers with UITableViewCell.DequeueReusableCell()
    var view = (convertView ?? context.LayoutInflater.Inflate(Resource.Layout.LawsAndRegsListItem, parent, false)) as LinearLayout;

    //Find references to each subview in the list item's view
    ImageView imgView = (ImageView)view.FindViewById(Resource.Id.imageItem);
    imgView.Clickable = true;
    TextView textTop = (TextView)view.FindViewById(Resource.Id.textTop);
    textTop.Clickable = true;

    var bm = BitmapFactory.DecodeStream(
        new Java.Net.URL("http://www.SOME_SITE.com/" + item.Image).OpenStream());
    imgView.SetImageBitmap(bm);

    //Assign this item's values to the various subviews
    textTop.SetText(item.Name, TextView.BufferType.Normal);

    view.Clickable = true;

    //Finally return the view
    return view;
}

}

I added the view.clickable code in trying to get this to work.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Finally!! I found out my issue... it turned out that the problem was my ImageButton in the ListView. It was stealing the focus and consuming the touch events. So in my custom Adapter, in the GetView I needed to do something like the following:

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;

imageButton.Click += (sender, args) => Console.WriteLine("ImageButton {0} clicked", position);

That removes the focus from the image button. The solution was given to me here: http://forums.xamarin.com/discussion/871/how-do-i-get-itemclick-of-a-listview-to-get-called-not-sure-what-have-wrong#latest by Cheesebaron. Thank you Cheesebaron!!!

I hope this may help another newbie with a similar issue!!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...