问题
I have a class witch holds some variables...eg
int yellow = 0xffffff66;
int green = 0xff00EE76;
int red = 0xffff4342;
int blue = 0xff42c3ff;
int purple = 0xff9932CC;
int white = 0xffffffff;
ArrayList<Integer>nextColorArray = new ArrayList<Integer>();
int total_count = 0;
in my onCreate method:
GridView gridview2 = (GridView) findViewById(R.id.colorNext);
gridview2.setAdapter(new ImageAdapter(this));
nextColorArray.add(blue);
nextColorArray.add(green);
nextColorArray.add(red);
nextColorArray.add(yellow);
nextColorArray.add(purple);
from my adapter i add elements to the grid view to produce 5 colors the show in the gridview UI no problem... o.k
i have a button onclick(not in onCreate) event that increments total_count by 1 each time i click the button...o.k when the total_count is greater than ten i want to add a new element to the array..ok
if (action == MotionEvent.ACTION_DOWN) {
if(total_Count > 10){
nextColorArray.add(0, white);
}...ok
my problem is that the UI gridview is not updating the ui to show the new color...any ideas on how i can update the adapter when a new color is added to the list????
Edit: Since i am not sure how many edit's i made to my post. i edited the question and added the answer here. This works .
public class MainActivity extends Activity {
int yellow = 0xffffff66;
int green = 0xff00EE76;
int red = 0xffff4342;
int blue = 0xff42c3ff;
int purple = 0xff9932CC;
int white = 0xFFFFFFFF;
int total_Count = 0;
int colorPosition = 0;
int colorPickerStart = 0;
Button button;
ImageView imageView;
ImageAdapter ia;
GridView gridview2;
ArrayList<Integer>nextColorArray = new ArrayList<Integer>(10);
ArrayList<Integer>colorPicker = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nextColorArray.add(blue);
nextColorArray.add(green);
nextColorArray.add(red);
nextColorArray.add(yellow);
nextColorArray.add(purple);
//set adapters
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ButtonAdapter(this));
button = (Button) findViewById(R.id.button1);
gridview2 = (GridView) findViewById(R.id.gridview2);
ia = new ImageAdapter(this, nextColorArray);
gridview2.setAdapter(ia);
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
nextColorArray.add(Color.BLACK);
ia.notifyDataSetChanged();
}
});
//next color elements
}
public class ImageAdapter extends BaseAdapter {
private Context mContext;
ArrayList<Integer> a;
public ImageAdapter(Context c, ArrayList<Integer> a) {
mContext = c;
this.a = a;
}
public int getCount() {
return a.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return 0;
}
/*create a new ImageView for each item referenced by the Adapter*/
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {/*if it's not recycled, initialize some attributes*/
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(50, 45));
imageView.setBackgroundColor(nextColorArray.get(colorPosition));
if(colorPosition < 9) colorPosition++;
} else {
imageView = (ImageView) convertView;
}
return imageView;
}
}
/*button adapter*/
public class ButtonAdapter extends BaseAdapter {
private Context mContext;
public ButtonAdapter(Context c) {
mContext = c;
}
public int getCount() {
return nextColorArray .size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return 0;
}
// create a new button for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
button = new Button(mContext);
button.setLayoutParams(new GridView.LayoutParams(128, 128));
total_Count++;
button.setText(""+total_Count);
} else {
button = (Button) convertView;
}
return button;
}// end get view
}// end button adapter
activity_main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:columnWidth="0dp"
android:gravity="center"
android:numColumns="2"
android:horizontalSpacing="20dp"
android:padding="40dp"
android:verticalSpacing="20dp" />
<GridView
android:id="@+id/gridview2"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:layout_above="@+id/button1"
android:layout_alignParentRight="true"
android:layout_marginBottom="74dp"
android:columnWidth="0dp"
android:gravity="center"
android:horizontalSpacing="20dp"
android:numColumns="2"
android:padding="40dp"
android:verticalSpacing="20dp" >
</GridView>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Button" />
</RelativeLayout>
回答1:
You have to call notifyDataSetChanged()
on your adapter in order to refresh its content.
回答2:
ImageAdapter ia;
GridView gridview2 = (GridView) findViewById(R.id.colorNext);
ia = new ImageAdapter(this);
gridview2.setAdapter(ia);
....
if (action == MotionEvent.ACTION_DOWN) {
if(total_Count > 10){
nextColorArray.add(0, white);
ia.notifyDataSetChanged(); // call notifyDataSetChanged to update your gridview
}
public void notifyDataSetChanged ()
Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
Example:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:columnWidth="0dp"
android:gravity="center"
android:numColumns="2"
android:horizontalSpacing="20dp"
android:padding="40dp"
android:verticalSpacing="20dp" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Button" />
</RelativeLayout>
MainActivity
public class MainActivity extends Activity {
ImageAdapter im;
ImageView imageView;
GridView gd;
ArrayList<Integer>nextColorArray = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int yellow = 0xffffff66;
int green = 0xff00EE76;
int red = 0xffff4342;
int blue = 0xff42c3ff;
int purple = 0xff9932CC;
final int white = 0xffffffff;
nextColorArray.add(blue);
nextColorArray.add(green);
nextColorArray.add(red);
nextColorArray.add(yellow);
nextColorArray.add(purple);
gd= (GridView) findViewById(R.id.gridview);
im = new ImageAdapter(this,nextColorArray);
gd.setAdapter(im);
Button b= (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
nextColorArray.add(Color.BLACK);
im.notifyDataSetChanged();
}
});
}
}
ImageAdapter
public class ImageAdapter extends BaseAdapter{
Context mContext;
ArrayList<Integer> a;
public ImageAdapter(Context context,ArrayList<Integer> a) {
mContext=context;
this.a= a;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return a.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View arg1, ViewGroup arg2) {
ImageView imageView;
if (arg1 == null) {
imageView = new ImageView(mContext);
imageView.setPadding(0, 20, 0, 0);
} else {
imageView = (ImageView) arg1;
}
imageView.setBackgroundColor(a.get(position));
return imageView;
}
}
As and when you click black color appears on the screen.
SnapShot
来源:https://stackoverflow.com/questions/16652812/android-adapter-not-updating-ui