从网格视图更改项目

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).