2015-05-11 5 views
4

У меня есть GridView из TextViews, я хочу, чтобы каждый из них просматривал TextView, меняя его фон, ждем 1 секунду и переходим к следующему TextView и делаем то же самое.android Подождите, пока обновления GridView

Первые начать ни с кем из TextViews быть окрашен

SoE1

Тогда я хочу, чтобы цвет первого TextView

SoE2

Теперь я хочу, чтобы ждать в течение одной секунды .. .

и после этого.

SoE3

И повторить с остальными TextViews.

Проблема заключается в том, что MainActivity.playSoE(), метод, который выполняет обновление сетки, использует notifyDataSetChanged() для обновления GridView. Это делает проблему с резьбой более важной. Все, что я пробовал, либо вызывает исключение, либо замораживает все, и пропускает промежуточные шаги, пока не будет окрашена вся сетка. Я пробовал использовать Activity.runOnUiThread(), wait(), Thread.sleep() и попытался сделать новый Thread, но ни один из них не работал на меня. I

И чтобы уточнить, я хочу, чтобы иметь возможность общаться с остальной частью приложения, пока сетка окрашивается, я не хочу, чтобы все приложение зависало на мне.

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

ImageAdapter.java:

public class ImageAdapter extends ArrayAdapter { 
    private Context mContext; 
    private int mCount; 
    private boolean setBlueBackground = false; 
    private int[] gridColors; 

    public ImageAdapter(Context c, int resource, int count) { 
     super(c, resource); 
     mContext = c; 
     mCount = count; 
     gridColors = new int[mCount]; 
     Arrays.fill(gridColors,Color.LTGRAY); 
    } 


    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); 
      textView.setGravity(Gravity.CENTER); 
      textView.setLayoutParams(new GridView.LayoutParams(100, 100)); 

     } else { 
      textView = (TextView) convertView; 
     } 


     textView.setBackgroundColor(gridColors[position]); 

     textView.setText("" + position); 
     return textView; 
    } 

    public void setPositionColor(int position, int color) { 
     gridColors[position] = color; 
     notifyDataSetChanged(); 
    } 

} 

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> 

menu_main.xml:

<?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> 

ответ

0

Вы можете использовать обработчик для задержки и выполнять свои действия

Отредактировано

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

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

    } 

Это будет выполняться в течение 1 секунды и обновляет данные

+0

Нет, они все еще обновляются одновременно. – user2361174

+0

измените ваш arraylist на один, а затем назовите этот метод, а затем для другого вам нужно будет выполнить это в цикле for, где вы обновляете каждый arraylist. –

+0

Что вы имеете в виду, меняя мой arraylist? Здесь я не использую ArrayLists. Также я использую цикл for для вызова обработчика, один раз для каждого обновления. Вы можете увидеть его в разделе «MainActivity».playSoE() ' – user2361174

0

В конечном итоге вы должны перейти к использованию RecyclerView с GridLayoutManager. RecyclerView предлагает очень гибкие методы для обновления пользовательского интерфейса. В вашем случае notifyItemChanged (int position) будет эффективно обновлять один текстовый файл. Узнать больше here.

Смежные вопросы