ListView Choices: What the devil is happening?

by kingkung » Thu, 23 Oct 2008 10:31:21 GMT


Sponsored Links
 I wrote a small activity which illustrates some crazy behavior I found
while implementing ListView and choices.  Feel free to plug this in
and try it yourselves (and be sure to check logcat as well):

public class TestActivity extends ListActivity {

        public String[] strings = { "What","the","devil","is","happening?" };

        @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.listview);
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        getListView().setAdapter(new
ArrayAdapter<String>(this,R.layout.main,strings));
        getListView().setOnItemClickListener(new OnItemClickListener()
{
                        public void onItemClick(AdapterView<?> arg0, View arg1, 
int arg2,
                                        long arg3) {
                                        Log.d("test","Checked: "+
((TextView)getListView().getChildAt(arg2)).getText().toString());
                                        if (getListView().isItemChecked(arg2))
                                        {
                                                for (int i=0; 
i<getListView().getChildCount(); i++)
                                                {
                                                        if (i==arg2)
                                                                
getListView().getChildAt(i).setBackgroundColor(Color.MAGENTA);
                                                        else
        
getListView().getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
                                                }
                                        }
                                        else
        
getListView().getChildAt(arg2).setBackgroundColor(Color.TRANSPARENT);

                                }
        });
    }
}

The R.layout.main is just your standard default TextView when you
create a new project in Eclipse.  The R.layout.listview is the
standard LinearLayout with embedded ListView for ListActivities shown
below:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=" http://schemas.android.com/apk/res/ 
android"
      android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
        <ListView android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
    />
</LinearLayout>

Can anyone explain rationally what is causing this to happen?
--~--~---------~--~----~------------~-------~--~----~



ListView Choices: What the devil is happening?

by Romain Guy » Thu, 23 Oct 2008 10:40:53 GMT


 You haven't explained what the crazy behavior is :) My bet is that you
call isChecked() too early. Try to postpone everything you do in the
OnItemClickListener by posting a Runnable into a Handler (or with
getListView().post()).






-- 
Romain Guy
www.curious-creature.org

--~--~---------~--~----~------------~-------~--~----~


Sponsored Links


ListView Choices: What the devil is happening?

by kingkung » Thu, 23 Oct 2008 10:49:25 GMT


  kind of wanted people to try it and find out :)  I can try that, but
it doesn't look like it's a race condition (like something gets called
too early or something) of any kind... it's a very distinct pattern of
behavior that's happening, though it's not what I would consider the
expected behavior...

On Oct 22, 7:40pm, "Romain Guy" <[EMAIL PROTECTED]> wrote:
--~--~---------~--~----~------------~-------~--~----~



ListView Choices: What the devil is happening?

by Romain Guy » Thu, 23 Oct 2008 10:51:56 GMT


 ould you please explain what you are witnessing? (I work on ListView,
I'd like to help... :)

There's another issue in your code. In the for loop, you are comparing
a position (arg2) with an index (i). These are different and mixing
them will cause tons of "weird" issues.

On Wed, Oct 22, 2008 at 7:49 PM, kingkung <[EMAIL PROTECTED]> wrote:



--
Romain Guy
www.curious-creature.org

--~--~---------~--~----~------------~-------~--~----~



ListView Choices: What the devil is happening?

by kingkung » Thu, 23 Oct 2008 11:30:26 GMT


  just sent you an email explaining the problem to your google
account. :)

On Oct 22, 7:51pm, "Romain Guy" <[EMAIL PROTECTED]> wrote:
--~--~---------~--~----~------------~-------~--~----~



ListView Choices: What the devil is happening?

by Romain Guy » Thu, 23 Oct 2008 11:55:37 GMT


 k so the issue is what I noticed: you are mixing index and positions.
A ListView contains only as many items as it needs to fill the screen.
For instance, you can see 8 items on screens, there are 8 children in
the ListView, numbered from 0 to 7 (the index.) However, your adapter
can have many more items, for instance 400. The position (arg2 in your
code) indicates the index of an item *in the adapter*. This means that
the View of index 2 is not necessarily the adapter's item of position
2. To do the conversion, you can use
ListView.getFirstVisiblePosition().

Here is your code with the fix:

if (i==arg2) becomes if (getListView().getFirstVisiblePosition() + i == arg2)
and all the getChildAt(arg2) become getChildAt(arg2 -
getListView().getFirstVisiblePosition())


On Wed, Oct 22, 2008 at 8:20 PM, kingkung <[EMAIL PROTECTED]> wrote:



--
Romain Guy
www.curious-creature.org

--~--~---------~--~----~------------~-------~--~----~



ListView Choices: What the devil is happening?

by kingkung » Fri, 24 Oct 2008 00:43:10 GMT


 ust made the changes, the behavior is identical... this is my updated
code, feel free to make sure I made all changes:

public String[] strings = { "What","the","devil","is","happening?" };

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.listview);
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setAdapter(new
ArrayAdapter<String>(this,R.layout.main,strings));
getListView().setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2,
long arg3) {
// Log.d("test","Checked: "+
((TextView)getListView().getChildAt(arg2)).getText().toString());
if (getListView().isItemChecked(arg2))
{
for (int i=0;
i<getListView().getChildCount(); i++)
{
if
(getListView().getFirstVisiblePosition()+i==arg2)

getListView().getChildAt(i).setBackgroundColor(Color.MAGENTA);
else

getListView().getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
}
}
else
getListView().getChildAt(arg2-
getListView().getFirstVisiblePosition()).setBackgroundColor(Color.TRANSPARENT);

}
});
}

On Oct 22, 8:45pm, "Romain Guy" <[EMAIL PROTECTED]> wrote:
--~--~---------~--~----~------------~-------~--~----~



Other Threads

1. can we read and write a same file using 2 thread

In my application, if I uses one thread to write a file. Can I use
another thread to read from the same file?

What would happen? will th OS locks the file when read or write?

Thanks.

Cindy

-- 

2. NoClassDefFoundError when running the app

Hi.
I have a problem with a library which i would like to use in my
project.
Here is the situtation:
I have an android project which has another Java Project in its build
path. Thats fine. The other java project reffers to another *.jar
library on its buildpath. Eclipse does not show any errors. But when i
try to call a method of the java project out of my android project it
cannot find the classes which are in the *.jar file of the java
project. It throws a NoClassDefFoundException.

Android seems to doesnt find the *.jar file within the other java-
project.....

Can anyone tell me what's the problem here....

Again: the projectstructure:

ANDROID PROJECT ---uses---> JAVA PROJECT --uses---> *.jar
when I call a method of the javaproject out of the android project a
NoClassDefFoundException is thrown at the point where classes of the
*.jar file were used.... :/


greets

-- 

3. Get all images taken by the camera?

4. Create rows at Runtime

5. Ksoap2 Android project revived and new release

6. Storage

7. Monitor a task activity (view data activity)