Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android在GridView更新之间等待_Java_Android_Multithreading_Gridview_Android Adapter - Fatal编程技术网

Java android在GridView更新之间等待

Java android在GridView更新之间等待,java,android,multithreading,gridview,android-adapter,Java,Android,Multithreading,Gridview,Android Adapter,我有一个TextView的GridView,我想迭代每个TextView,改变它的背景,等待1秒,然后转到下一个TextView并做同样的事情 首先,所有文本视图都不着色 然后我想给第一个文本视图上色 现在我想等一秒钟 然后呢 并对其余的文本视图重复此操作 问题是,MainActivity.playSoE(),用于更新网格的方法,使用notifyDataSetChanged()更新网格视图。这使得线程成为一个更大的问题。我尝试过的所有操作都会导致异常,或者冻结所有操作并跳过中间步骤,直到整

我有一个TextView的GridView,我想迭代每个TextView,改变它的背景,等待1秒,然后转到下一个TextView并做同样的事情

首先,所有文本视图都不着色

然后我想给第一个文本视图上色

现在我想等一秒钟

然后呢

并对其余的文本视图重复此操作

问题是,
MainActivity.playSoE()
,用于更新网格的方法,使用
notifyDataSetChanged()
更新网格视图。这使得线程成为一个更大的问题。我尝试过的所有操作都会导致异常,或者冻结所有操作并跳过中间步骤,直到整个网格着色为止。我尝试过使用
Activity.runOnUiThread()
wait()
Thread.sleep()
,并尝试创建一个新的
线程
,但这些都不适用于我。我

为了澄清这一点,我希望能够在网格着色时与应用程序的其余部分进行通信,我不希望整个应用程序冻结在我身上

MainActivity.java:

public class MainActivity extends ActionBarActivity {

    private boolean mIsPlaying;
    private int primesLE;
    private GridView mGridView;
    private ImageAdapter mAdapter;
    private Thread mThread;

    private void dataVisualization(){

        int numOfColumns = (int)Math.round(Math.sqrt((double) primesLE));
        //int numOfRows = (int)Math.ceil((double)primesLE/(double)numOfColumns);
        ViewGroup.LayoutParams layoutParams;

        layoutParams = mGridView.getLayoutParams();
        layoutParams.width = 150*numOfColumns; //this is in pixels
        mGridView.setLayoutParams(layoutParams);
        mGridView.setNumColumns(numOfColumns);
        mAdapter = new ImageAdapter(this, android.R.layout.simple_list_item_1, primesLE);
        mGridView.setAdapter(mAdapter);

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mIsPlaying = false;
        primesLE = 0;


        View relativeLayout = findViewById(R.id.relativeLayout);
        View title_horizontalScrollView = relativeLayout.findViewById(R.id.title_horizontalScrollView);
        View dataLayout = title_horizontalScrollView.findViewById(R.id.dataLayout);
        mGridView = (GridView) dataLayout.findViewById(R.id.mGridView);

        dataVisualization();

        View inputLayout = relativeLayout.findViewById(R.id.inputLayout);
        final EditText inputEditText = (EditText)inputLayout.findViewById(R.id.inputEditText);
        inputEditText.setOnKeyListener(new EditText.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button
                if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                        (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Perform action on key press

                    InputMethodManager inputManager = (InputMethodManager) MainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputManager.hideSoftInputFromWindow(inputEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

                    try {
                        primesLE = Integer.parseInt(inputEditText.getText().toString());
                    } catch(NumberFormatException nfe) {
                        inputEditText.setText("Try again");
                        primesLE = 0;
                    }
                    if(primesLE < 0)
                        primesLE = 0;

                    dataVisualization();

                    Toast.makeText(MainActivity.this, inputEditText.getText(), Toast.LENGTH_SHORT).show();

                    return true;
                }
                return false;
            }
        });
        inputEditText.setOnClickListener(new EditText.OnClickListener() {
            @Override
            public void onClick(View v) {
                inputEditText.getText().clear();
            }
        });
    }




    @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;
    }

    private void playSoE(){

        for(int i = 0; i < primesLE; i++) {
            mAdapter.setPositionColor(i, 0xffff0000 + 0x100 * i); //calls notifyDataSetChanged()
             new Handler().postDelayed(new Runnable() {
                 @Override
                 public void run() {
                     notifyDataSetChanged();
                 }
             }, 1000);

        }
    }

    @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);
    }
}
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<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:id="@+id/relativeLayout"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/inputLayout"
        android:layout_alignParentTop="true"
        android:background="#a9a9a9"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center_vertical"
            android:id="@+id/textView"
            android:text="All primes less than\n or equal to this number:"
            android:layout_centerVertical="true"
            android:layout_alignParentStart="true" />



        <!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
        <LinearLayout
            android:focusable="true" android:focusableInTouchMode="true"
            android:layout_width="0px" android:layout_height="0px"
            android:inputType="numberSigned"/>

        <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
             to prevent the dummy from receiving focus again -->

        <AutoCompleteTextView android:id="@+id/autotext"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:nextFocusUp="@id/autotext" android:nextFocusLeft="@id/autotext"
            android:inputType="numberSigned" android:imeOptions="actionDone"
            android:layout_gravity="center_vertical" android:gravity="center_vertical"
            android:layout_centerVertical="true" android:layout_toEndOf="@+id/textView"/>

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center_vertical"
            android:inputType="numberSigned"
            android:ems="10"
            android:id="@+id/inputEditText"
            android:layout_centerVertical="true"
            android:layout_alignEnd="@+id/autotext"
            android:layout_toEndOf="@+id/textView" />

    </RelativeLayout>


    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inputLayout"

        android:id="@+id/title_horizontalScrollView"
        android:fillViewport="true">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity"
            android:id="@+id/dataLayout"
            >

            <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"
                android:layout_alignParentBottom="true" />

        </RelativeLayout>

    </HorizontalScrollView>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_status"
        android:icon="@drawable/ic_action_play"
        android:title="Play"
        app:showAsAction="always"/>
    <item android:id="@+id/action_stop"
        android:icon="@drawable/ic_action_stop"
        android:title="Stop"
        app:showAsAction="always"/>
    <item android:id="@+id/action_settings"
            android:title="@string/action_settings"
            app:showAsAction="never"  />

    </menu>

menu_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<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:id="@+id/relativeLayout"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/inputLayout"
        android:layout_alignParentTop="true"
        android:background="#a9a9a9"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center_vertical"
            android:id="@+id/textView"
            android:text="All primes less than\n or equal to this number:"
            android:layout_centerVertical="true"
            android:layout_alignParentStart="true" />



        <!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
        <LinearLayout
            android:focusable="true" android:focusableInTouchMode="true"
            android:layout_width="0px" android:layout_height="0px"
            android:inputType="numberSigned"/>

        <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
             to prevent the dummy from receiving focus again -->

        <AutoCompleteTextView android:id="@+id/autotext"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:nextFocusUp="@id/autotext" android:nextFocusLeft="@id/autotext"
            android:inputType="numberSigned" android:imeOptions="actionDone"
            android:layout_gravity="center_vertical" android:gravity="center_vertical"
            android:layout_centerVertical="true" android:layout_toEndOf="@+id/textView"/>

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center_vertical"
            android:inputType="numberSigned"
            android:ems="10"
            android:id="@+id/inputEditText"
            android:layout_centerVertical="true"
            android:layout_alignEnd="@+id/autotext"
            android:layout_toEndOf="@+id/textView" />

    </RelativeLayout>


    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inputLayout"

        android:id="@+id/title_horizontalScrollView"
        android:fillViewport="true">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity"
            android:id="@+id/dataLayout"
            >

            <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"
                android:layout_alignParentBottom="true" />

        </RelativeLayout>

    </HorizontalScrollView>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_status"
        android:icon="@drawable/ic_action_play"
        android:title="Play"
        app:showAsAction="always"/>
    <item android:id="@+id/action_stop"
        android:icon="@drawable/ic_action_stop"
        android:title="Stop"
        app:showAsAction="always"/>
    <item android:id="@+id/action_settings"
            android:title="@string/action_settings"
            app:showAsAction="never"  />

    </menu>

您可以使用处理程序延迟并执行操作

已编辑

for(int i = 0; i < primesLE; i++) {

         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
                 mAdapter.setPositionColor(i, 0xffff0000 + 0x100 * i);
                 notifyDataSetChanged();
             }
         }, 1000);

    }
for(int i=0;i

这将执行1秒并更新数据

最终您应该切换到使用带有GridLayoutManager的RecyclerView。RecyclerView提供了非常灵活的方法来更新UI。在您的情况下,notifyItemChanged(int位置)将有效地更新单个TextView。了解更多信息。

为一个更改arraylist,然后调用此方法,然后为另一个更改arraylist。您必须在for循环中执行此操作,更新每个arraylist。更改我的arraylist是什么意思?我这里没有使用任何ArrayList。我还使用for循环调用处理程序,每次更新一次。您可以在
MainActivity.playSoE()
中看到它。我已将您的代码添加到我的代码中,以向您展示我的尝试。请检查我更新了我的答案,您可以根据我编辑的答案进行更改