When you create a brand-new convertView (v) in your getView(...)
method (within the if (v==nul) {....} block), call the
setOnCheckChangeListener on the SelectActor checkbox in 'v'.
Every time when getView(...) is called, attach your Actor to the
Selector checkbox, by calling setTag:
public View getView(....) {
...
...
SelectActor.setTag(null); // prevent eternal looping
SelectActor.setChecked(a.isSelected);
SelectActor.setTag(a);
...
}
Then in the OnCheckChangedListener implement this
public void onCheckedChanged (CompoundButton buttonView, boolean
isChecked) {
...
Actor a = (Actor)buttonView.getTag();
if (a != null) {
a.isSelected = isChecked;
// The call below may not be necessary....
ard.notifyDataSetChanged();
}
}
On Oct 28, 1:17 pm, stanchat <[email protected]> wrote:
> This will work for the AddAll and ClearAll buttons. How do I make it
> work for an indiviudal actor (clicking Checkbox for actor) such that
> the isSelected field gets changed properly. I see I have the
> setOnCheckedChangeListener for a checkbox but how do I get the
> position of the ActorList to actually change.
>
> On Oct 28, 10:30 am, Streets Of Boston <[email protected]>
> wrote:
>
>
>
> > I see that in the onClick, you try to access the list's (GridView's)
> > items by accessing its child-views. This is not correct.
>
> > Child-views are re-used for when displaying items in the
> > listview(GridView). When a child-view (list-item view) scrolls off the
> > screen, it is re-used for ones that start scrolling into the visible
> > screen.
>
> > Also:
> > The call 'Actor a = (Actor) gv.getAdapter().getItem(position)' looks
> > incorrect.
> > '// Actor a = items.get(position);' should be un-commented. This is
> > the correct way of getting your Actor.
>
> > Add a field to Actor that check if it is selected:
> > public class Actor ... {
> > boolean isSelected;
> > ...
>
> > }
>
> > In the onClick of your Select-All button, call your adapter, not your
> > GridView, to obtain all the Actors:
>
> > for (int i = 0; i < ard.getCount();; i++) {
> > Actor a = (Actor)arg.getItem(i);
> > a.isSelected = true;
> > ...
> > }
> > ard.notifyDataSetChanged(); // this will call the adapter's
> > getView(...) to be called.
>
> > Then in your adapter, do this:
>
> > public int getCount() {
> > return items.size();
> > }
>
> > public Actor getItem(int position) {
> > return items.get(position);
> > }
>
> > public View getView(int position, View convertView, ViewGroup
> > parent) {
> > ...
> > ...
> > Actor a = getItem(position)
> > CheckBox cb = v.findViewById(R.id.CheckBoxActor);
> > cb.setChecked(a.isSelected);
>
> > TextView tv = v.findViewById(R.id.TextViewActor);
> > tv.setText(a.ActorImageView.getText());
> > ... etc...
>
> > }
>
> > Never call your adapter's getView(....) method yourself. It will be
> > called by the framework. It's a call-*back* function.
>
> > If you want to change the items in the list-view, do *not* change the
> > list-item views (child-views) of the listview (GridView). Instead,
> > change the data in the adapter, then call the adapter's
> > 'notifyDataSetChanged()' method.
>
> > On Oct 28, 10:35 am, stanchat <[email protected]> wrote:
>
> > > I'm have a custom GridView Array Adapter. The problem for me is that
> > > when the grid list gets large enough to scroll off the screen the
> > > gridview and arraylist get out of sync. For instance in my case I
> > > have code that checks if an actor is of type director the text color
> > > should be red. if you scroll up and down my list enough times all the
> > > actors text in my gridview will become red. The thing is that the
> > > Gridview appearance actually looks fine its the backing data. Here is
> > > the complete class. In the code you can see where I tried to override
> > > getItem and getItemId but that didn't fix anything.
>
> > > =============================================================================
> > > package com.goldendoodlegames.android.hollywoodempire;
>
> > > import java.text.DecimalFormat;
> > > import java.util.ArrayList;
> > > import java.util.Comparator;
> > > import java.util.List;
>
> > > import android.app.*;
> > > import android.content.Context;
> > > import android.content.Intent;
> > > import android.graphics.Color;
> > > import android.graphics.drawable.Drawable;
> > > import android.media.MediaPlayer;
> > > import android.net.Uri;
> > > import android.os.*;
> > > import android.text.Editable;
> > > import android.text.InputFilter;
> > > import android.text.TextWatcher;
> > > import android.view.LayoutInflater;
> > > import android.view.View;
> > > import android.view.ViewGroup;
> > > import android.view.View.OnClickListener;
> > > import android.widget.ArrayAdapter;
> > > import android.widget.BaseAdapter;
> > > import android.widget.Button;
> > > import android.widget.CheckBox;
> > > import android.widget.EditText;
> > > import android.widget.Filter;
> > > import android.widget.Filterable;
> > > import android.widget.GridView;
> > > import android.widget.ImageView;
> > > import android.widget.ListView;
> > > import android.widget.TextView;
>
> > > public class ActorsView extends Activity {
>
> > > private static ArrayList<Actor> ActorList;
> > > ActorRowAdapter ard;
> > > GridView g1;
>
> > > //
> > > private static class ActorRowAdapter extends ArrayAdapter<Actor> {
> > > private LayoutInflater mInflater;
> > > private ArrayList<Actor> items;
>
> > > public ActorRowAdapter(Context context, int resource,
> > > int textViewResourceId, ArrayList<Actor>
> > > items) {
> > > super(context, resource, textViewResourceId,
> > > items);
> > > this.items = items;
> > > mInflater = LayoutInflater.from(context);
> > > }
>
> > > // public int getCount() {
> > > // return ActorList.size();
> > > // }
> > > //
> > > // public Actor getItem(int position) {
> > > // return ActorList.get(position);
> > > // }
> > > //
> > > // public long getItemId(int position) {
> > > // return position;
> > > // }
> > > @Override
> > > public View getView(int position, View convertView,
> > > ViewGroup
> > > parent) {
> > > super.getView(position, convertView, parent);
> > > View v = convertView;
> > > if (v == null) {
> > > v =
> > > mInflater.inflate(R.layout.actorgridrow, null);
> > > }
> > > //Actor a = items.get(position);
> > > GridView gv = (GridView) parent;
> > > Actor a = (Actor)
> > > gv.getAdapter().getItem(position);
> > > if (a != null) {
> > > TextView Actor = (TextView)
> > > v.findViewById(R.id.TextViewActor);
> > > CheckBox SelectActor = (CheckBox) v
> > >
> > > .findViewById(R.id.CheckBoxActor);
> > > if (Actor != null) {
> > >
> > > Actor.setText(a.ActorImageView.getText());
> > > if
> > > (a.Type.toLowerCase().equals("director"))
> > >
> > > Actor.setTextColor(Color.RED);
> > > }
> > > if (SelectActor != null) {
> > >
> > > SelectActor.setChecked(a.Visibility);
> > > Drawable[] actDraw =
> > > a.ActorImageView
> > >
> > > .getCompoundDrawables();
> > >
> > > SelectActor.setBackgroundDrawable(actDraw[1]);
> > > }
> > > }
> > > return v;
> > > }
> > > }
>
> > > @Override
> > > public void onCreate(Bundle savedInstanceState) {
> > > super.onCreate(savedInstanceState);
> > > try {
> > > setContentView(R.layout.actorslayout);
> > > } catch (Exception ex) {
> > > ex.printStackTrace();
> > > }
> > > ActorList = (ArrayList<Actor>)
> > > HollyWoodEmpire.extGM.CurrentPlayer.ActorInventory;
>
> > > Button btnSelectAllActors = (Button)
> > > findViewById(R.id.ButtonSelectAllActors);
> > > btnSelectAllActors.setOnClickListener(new
> > > OnClickListener() {
> > > public void onClick(View v) {
> > > int lc = g1.getChildCount();
>
> > > for (int i = 0; i < lc; i++) {
> > > View gvw = (View)
> > > g1.getChildAt(i);
> > > // View vw =
> > > g1.getAdapter().getView(i, null, null);
> > > CheckBox SelectActor = (CheckBox)
> > > gvw
> > >
> > > .findViewById(R.id.CheckBoxActor);
> > > SelectActor.setChecked(true);
>
> > > }
>
> > > }
> > > });
>
> > > Button btnClearAllActors = (Button)
> > > findViewById(R.id.ButtonClearAllActors);
> > > btnClearAllActors.setOnClickListener(new
> > > OnClickListener() {
> > > public void- Hide quoted text -
>
> - Show quoted text -...
>
> read more »
--
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