: http://123maza.com/65/rings780/: http://123maza.com/65/rings780/: http://123maza.com/65/rings780/
On May 12, 7:13 am, authorwjf <[email protected]> wrote: > Hello Android UI Gurus, > > I have been struggling for a few days now with an annoying UI issue. > I've whittled the project down to nothing but a small demonstration of > the problem. I admit I'm pretty new to Android UI work, but at the > same time I'm an experienced, qualified engineer and I just can't seem > to figure this out. I was hoping to get some feedback from some of > you out there who are more familiar with the internals and > idiosyncrasies of the platform. Any help would be greatly > appreciated! > > The desired behavior: > I have a list view. Each list view row consists of a text element, > and a hidden image. When an item is selected from the list, I'd like > to make the image visible, and, start an animation on it. Pretty > standard stuff here, we're talking basically about a "loading" > spinner. > > The problem: > After selecting 2 or sometimes 3 items in the list, I see spinners > become visible and start animating for rows which were never > selected. The two things that lead me to believe this is a bug with > the platform are: > > A) Putting in a break point I can clearly see that the underlying data > source from the list does not have the "isSpinning" property set for > the items that begin animating in a seemingly random manner. > > and > > B) The only code that makes the image visible and begins the animation > for that row is inside of my custom data adapter. Before it can start > the animation it changes the text field in that row as well. The text > fields are not changed in the rows where my spinners seem to appear of > their own accord. > > The code: > As I said when I started this post I've removed everything from the > project except the relevant UI code. Here is what I have. > > /res/layout > main.xml=> > <?xml version="1.0" encoding="utf-8"?> > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ > android" > android:orientation="vertical" > android:layout_width="fill_parent" > android:layout_height="fill_parent" > > <TextView > android:layout_width="fill_parent" > android:layout_height="wrap_content" > android:text="@string/hello"/> > <ListView > android:id="@+id/android:list" > android:layout_width="fill_parent" > android:layout_height="fill_parent" > android:cacheColorHint="#0000" > android:background="@android:color/transparent" > android:dividerHeight="1dip"/> > </LinearLayout> > > list_view_row.xml=> > <?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="?android:attr/listPreferredItemHeight" > android:padding="6dip"> > <LinearLayout > android:layout_width="fill_parent" > android:layout_height="wrap_content" > android:orientation="horizontal"> > <TextView > android:id="@+id/label" > android:textSize="11sp" > android:padding="2dip" > android:gravity="center_vertical|center" > android:layout_gravity="center_vertical|center" > android:layout_width="wrap_content" > android:layout_height="wrap_content" > android:textColor="#ffffff"/> > <ImageView > android:id="@+id/spinner" > android:padding="2dip" > android:src="@drawable/loading" > android:layout_width="wrap_content" > android:layout_height="wrap_content"/> > </LinearLayout> > </LinearLayout> > > /res/anim > rotate.xml=> > <?xml version="1.0" encoding="UTF-8"?> > <rotate > xmlns:android="http://schemas.android.com/apk/res/android" > android:fromDegrees="0" > android:toDegrees="360" > android:pivotX="50%" > android:pivotY="50%" > android:repeatCount="infinite" > android:interpolator="@android:anim/linear_interpolator" > android:duration="1900" /> > > /res/drawable > spinner.png > > /src > MyContainer.java=> > public class MyContainer { > private String mText = ""; > private Boolean mLoading = false; > > public void setText(String mText) { > this.mText = mText; > } > public String getText() { > return mText; > } > public void setIsLoading(Boolean mLoading) { > this.mLoading = mLoading; > } > public Boolean isLoading() { > return mLoading; > } > > } > > CustomAdapter.java=> > public class CustomAdapter extends ArrayAdapter<MyContainer> { > > private ArrayList<MyContainer> items; > private Context c = null; > > public CustomAdapter(Context context, int textViewResourceId, > ArrayList<MyContainer> items) { > super(context, textViewResourceId, items); > this.items = items; > this.c = context; > } > > @Override > public View getView(int position, View convertView, ViewGroup > parent) { > View v = convertView; > if (v == null) { > LayoutInflater vi = > (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); > v = vi.inflate(R.layout.list_view_row, null); > } > TextView label = (TextView) v.findViewById(R.id.label); > ImageView spinner = (ImageView) v.findViewById(R.id.spinner); > MyContainer item = (MyContainer) items.get(position); > if (item.isLoading()) { > label.setText("***"+item.getText()+"***"); > spinner = (ImageView)v.findViewById(R.id.spinner); > spinner.setVisibility(View.VISIBLE); > Animation spinnerAnimation = > AnimationUtils.loadAnimation(getContext(), R.anim.rotate); > spinner.startAnimation(spinnerAnimation); > } else { > label.setText(item.getText()); > spinner.setVisibility(View.INVISIBLE); > } > > return v; > } > > } > > Main.java=> > public class Main extends ListActivity { > > private ArrayList<MyContainer> mItems = null; > private CustomAdapter mAdapter; > > /** Called when the activity is first created. */ > @Override > public void onCreate(Bundle savedInstanceState) { > super.onCreate(savedInstanceState); > setContentView(R.layout.main); > mItems = new ArrayList<MyContainer>(); > for (int i=0; i<10; i++) { > MyContainer item = new MyContainer(); > item.setIsLoading(false); > item.setText("item number "+Integer.toString(i)); > mItems.add(item); > } > mAdapter = new CustomAdapter(this, R.layout.list_view_row, > mItems); > setListAdapter(mAdapter); > > } > > /** > * Listview on click handler. > */ > @Override > public void onListItemClick(ListView parent, View v, int position, > long id){ > MyContainer item = > (MyContainer)parent.getItemAtPosition(position); > for (int i = 0; i<mItems.size(); i++) { > MyContainer tmp = mItems.get(i); > if (tmp.equals(item)) { > tmp.setIsLoading(true); > break; > } > } > mAdapter.notifyDataSetChanged(); > } > > > > > > > > } -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

