从网格视图更改项目
Changing an item from a gridview
我正在尝试访问我的 GridView 中的 TextView,并更改它们的背景颜色,以便在我调用 playSoE
方法时它会发生变化。
ImageAdapter.java:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private int mCount;
public int[] mIds; //stores Ids from TextViews
public ImageAdapter(Context c, int count) {
mContext = c;
mCount = count;
mIds = new int[mCount];
}
public int getCount() {
return mCount;
}
public Object getItem(int position) {
return null;
}
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) {
TextView textView;
if (convertView == null) {
// if it's not recycled, initialize some attributes
textView = new TextView(mContext);
mIds[position] = textView.getId(); //Id is stored into array
textView.setGravity(Gravity.CENTER);
textView.setLayoutParams(new GridView.LayoutParams(100, 100));
} else {
textView = (TextView) convertView;
}
textView.setBackgroundColor(Color.RED);
textView.setText("" + position);
return textView;
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:id="@+id/title_horizontalScrollView"
android:layout_margin="1dp"
android:fillViewport="false">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/relativelayout">
<GridView
android:id="@+id/mGridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</RelativeLayout>
</HorizontalScrollView>
MainActivity.java:
public class MainActivity extends ActionBarActivity {
private boolean mIsPlaying;
private int primesLE;
private GridView mGridView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIsPlaying = false;
ViewGroup.LayoutParams layoutParams;
primesLE = 225;
int numOfColumns = (int)Math.round(Math.sqrt((double) primesLE));
int numOfRows = (int)Math.ceil((double)primesLE/(double)numOfColumns);
GridView mGridView = (GridView) findViewById(R.id.mGridView);
layoutParams = mGridView.getLayoutParams();
layoutParams.width = 150*numOfColumns; //this is in pixels
mGridView.setLayoutParams(layoutParams);
mGridView.setNumColumns(numOfColumns);
mGridView.setAdapter(new ImageAdapter(this, primesLE));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
Log.d("Menu","Button Pressed");
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
else if (id == R.id.action_status){
if(mIsPlaying) {
mIsPlaying = false;
item.setIcon(R.drawable.ic_action_play);
item.setTitle("Play");
playSoE();
}
else {
mIsPlaying = true;
item.setIcon(R.drawable.ic_action_pause);
item.setTitle("Pause");
}
return true;
}
return super.onOptionsItemSelected(item);
}
private void playSoE(){
int[] viewIds = ((ImageAdapter)mGridView.getAdapter()).mIds; //trying to get the Ids for the TextViews, doesn't work and crashes
for(int i = 0; i < primesLE;i++){
Log.d("Getting view number",""+i);
mGridView.getAdapter().
getItem(i).setBackgroundColor(Color.BLUE);//this doesn't work, crashes
mGridView.getChildAt(i).setBackgroundColor(Color.BLUE); //this doesn't work either, crashes
}
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myname.sieveoferatosthenes" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我一直在寻找方法来做到这一点,但其中 none 似乎对我有用。
在你的 playSoE 方法中包含这个
<defined textview name here>.setBackgroundColor(Color.parseColor("#<hexadecimal color of your choice>"));
希望我帮到了你。
编辑:我个人更喜欢 w3 来查找十六进制颜色
http://www.w3schools.com/tags/ref_colorpicker.asp
应该包括什么
在 xml 文件中
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/whateveryouwantitsanid"
android:layout_weight="1"
/>
java
private TextView Texter;...
//in your on create
Texter = (TextView) findViewById(R.id.whateveryouwantitsanid);
//where you want to change background
Texter.setBackgroundColor(Color.parseColor("#yourhexcolorhere"));
ps我不知道你为什么要把你的 id 放在一个数组中
我解决了我的问题,mGridView
一直为空。在 MainActivity 中,我使用了 GridView mGridView = (GridView) findViewById(R.id.mGridView);
,这是糟糕的编码并且没有考虑到 GridView 嵌套在 xml 中。我把这个改成了
View v1 = findViewById(R.id.title_horizontalScrollView);
View v2 = v1.findViewById(R.id.relativelayout);
mGridView = (GridView) v2.findViewById(R.id.mGridView);
并且 mGridView 不再为空,然后使用 getChildAt(int position)
会得到我想要的 TextView (although some positions I still cannot access).
我正在尝试访问我的 GridView 中的 TextView,并更改它们的背景颜色,以便在我调用 playSoE
方法时它会发生变化。
ImageAdapter.java:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private int mCount;
public int[] mIds; //stores Ids from TextViews
public ImageAdapter(Context c, int count) {
mContext = c;
mCount = count;
mIds = new int[mCount];
}
public int getCount() {
return mCount;
}
public Object getItem(int position) {
return null;
}
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) {
TextView textView;
if (convertView == null) {
// if it's not recycled, initialize some attributes
textView = new TextView(mContext);
mIds[position] = textView.getId(); //Id is stored into array
textView.setGravity(Gravity.CENTER);
textView.setLayoutParams(new GridView.LayoutParams(100, 100));
} else {
textView = (TextView) convertView;
}
textView.setBackgroundColor(Color.RED);
textView.setText("" + position);
return textView;
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:id="@+id/title_horizontalScrollView"
android:layout_margin="1dp"
android:fillViewport="false">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/relativelayout">
<GridView
android:id="@+id/mGridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</RelativeLayout>
</HorizontalScrollView>
MainActivity.java:
public class MainActivity extends ActionBarActivity {
private boolean mIsPlaying;
private int primesLE;
private GridView mGridView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIsPlaying = false;
ViewGroup.LayoutParams layoutParams;
primesLE = 225;
int numOfColumns = (int)Math.round(Math.sqrt((double) primesLE));
int numOfRows = (int)Math.ceil((double)primesLE/(double)numOfColumns);
GridView mGridView = (GridView) findViewById(R.id.mGridView);
layoutParams = mGridView.getLayoutParams();
layoutParams.width = 150*numOfColumns; //this is in pixels
mGridView.setLayoutParams(layoutParams);
mGridView.setNumColumns(numOfColumns);
mGridView.setAdapter(new ImageAdapter(this, primesLE));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
Log.d("Menu","Button Pressed");
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
else if (id == R.id.action_status){
if(mIsPlaying) {
mIsPlaying = false;
item.setIcon(R.drawable.ic_action_play);
item.setTitle("Play");
playSoE();
}
else {
mIsPlaying = true;
item.setIcon(R.drawable.ic_action_pause);
item.setTitle("Pause");
}
return true;
}
return super.onOptionsItemSelected(item);
}
private void playSoE(){
int[] viewIds = ((ImageAdapter)mGridView.getAdapter()).mIds; //trying to get the Ids for the TextViews, doesn't work and crashes
for(int i = 0; i < primesLE;i++){
Log.d("Getting view number",""+i);
mGridView.getAdapter().
getItem(i).setBackgroundColor(Color.BLUE);//this doesn't work, crashes
mGridView.getChildAt(i).setBackgroundColor(Color.BLUE); //this doesn't work either, crashes
}
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myname.sieveoferatosthenes" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我一直在寻找方法来做到这一点,但其中 none 似乎对我有用。
在你的 playSoE 方法中包含这个
<defined textview name here>.setBackgroundColor(Color.parseColor("#<hexadecimal color of your choice>"));
希望我帮到了你。
编辑:我个人更喜欢 w3 来查找十六进制颜色 http://www.w3schools.com/tags/ref_colorpicker.asp
应该包括什么 在 xml 文件中
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/whateveryouwantitsanid"
android:layout_weight="1"
/>
java
private TextView Texter;...
//in your on create
Texter = (TextView) findViewById(R.id.whateveryouwantitsanid);
//where you want to change background
Texter.setBackgroundColor(Color.parseColor("#yourhexcolorhere"));
ps我不知道你为什么要把你的 id 放在一个数组中
我解决了我的问题,mGridView
一直为空。在 MainActivity 中,我使用了 GridView mGridView = (GridView) findViewById(R.id.mGridView);
,这是糟糕的编码并且没有考虑到 GridView 嵌套在 xml 中。我把这个改成了
View v1 = findViewById(R.id.title_horizontalScrollView);
View v2 = v1.findViewById(R.id.relativelayout);
mGridView = (GridView) v2.findViewById(R.id.mGridView);
并且 mGridView 不再为空,然后使用 getChildAt(int position)
会得到我想要的 TextView (although some positions I still cannot access).