2016年5月30日 星期一

Android 元件(面試考題) 動態生成Button,隨機產生X,並點擊 紀錄


心情小品:最近同班同學,陸陸續續開始接到面試等通知 於是分享了面試考題給我們參考!聽到這一個題目 我就聯想到 疑 這不是很像打地鼠的小遊戲嗎 XD感覺這應用方面也非常的廣泛、有趣,是一道很不錯的題目呢!這是小弟實現的方法,如果有更好方法的人 一定要跟我分享歐! 謝謝您!



Android 元件 Adapter、GridView

1.考題應用:

使用介紹:  gridView.setOnItemClickListener、Handler、Adapter、中介者設計模式等運用

簡單敘述: 每一個按鈕 隨機會出現x 當按下去的時候 標題就會+1




我們開始來實現這個功能吧
詳細位置:

Layout: 新增2個按鈕 及一個Gridview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
 android:orientation="vertical"
 tools:context="com.example.andy.blog_work_test_1.MainActivity">

 <Button
     android:onClick="onclick"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="開始"
     android:id="@+id/btn_start"
     android:layout_gravity="center_horizontal" />

 <Button
     android:onClick="onclick"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="增加 按鈕"
     android:id="@+id/btn_add"
     android:layout_gravity="center_horizontal" />

 <GridView
     android:layout_width="match_parent"
     android:layout_height="384dp"
     android:id="@+id/gridView"
     android:layout_gravity="center_horizontal" />
</LinearLayout>

JAVA:
package com.example.andy.blog_work_test_1;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

 private Context context;
 private GridView gridView;
 private List<String> list;
 private ArrayAdapter<String> adapter;
 private int max = 5;
 private Handler handler = new Handler();
 private int number;

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

     //先尋找ID
     finID();

     //初值設定
     initial();

     //開始
     startGame();
 }

 private void finID() {
     context = this;
     gridView = (GridView) findViewById(R.id.gridView);
 }

 private void initial() {
     // Adapter設計模式
     // Arraylist 和 View 透過 Adapter連結
     // 先把實體給『創造』、『初值』出來,再做『連結』

     //《初始》GraidView
     // 4格 = 2x2 →setNumColumns(2)
     //16格 = 4x4 →setNumColumns(4)
     //36格 = 6x6 →setNumColumns(6)
     // n格 = 根號n x 根號 n →setNumColumns()
     int index = (int) (Math.sqrt(max));
     gridView.setNumColumns(max);

     //《創造》《初始》Arraylist
     list = new ArrayList<String>();
     for (int i = 1; i <= max; i++) {
         list.add("●");}

     //《初始》Apadter
     adapter = new ArrayAdapter<String>       (context, android.R.layout.simple_expandable_list_item_1, list);

     //《連結》
     gridView.setAdapter(adapter);
 }

 private void startGame(){
     //《點擊》 GridView裡面的Item會觸發什麼事件
     //《事件-內容》 當我點下去的item 的String為"x"時,我的number++,且在標題上顯示
     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

             if (list.get(position).toString() == "X") {
                 TextView tv=(TextView)view;
                 tv.setText("O");
                 number++;

                 setTitle(number + "");
             }
         }
     });
 }

 public void onclick(View view) {
     switch (view.getId()) {

         case R.id.btn_start:
             Log.d("start","++");
         handler.post(new Runnable() {
             @Override
             public void run() {

方法1、方法2可以調用下唷(預設是方法2)
//                  方法1();
                 方法2();

                 //如果List的內容有改變,記得要刷新一下Adapter
                 adapter.notifyDataSetChanged();

                 //1.5秒後 再請handler 做一次自己
                 handler.postDelayed(this, 1000);
             }
         });
             break;

         case R.id.btn_add:
             //新增一個陣列
             list.add("●");
             //刷新
             adapter.notifyDataSetChanged();
             max++;
            break;
     }
 }

private void 方法1() {
     //先刪除陣列裡的內容
     list.removeAll(list);

     //先產生一個亂數 0~max之間
     int random = new Random().nextInt(max);

     //當我第i項=random,我第i項就改成"X",其他改成"O"
     for (int i = 1; i <= max; i++) {
         if (i == random) {
             list.add("X");
         } else {
             list.add("O");
         }
     }
 }

 private void 方法2() {

     //先在第0項 改成"X",其他項改成"O"
     list.set(0, "X");

     for (int i = 1; i <= max-1; i++) {
         list.set(i, "O");
     }

     //洗牌
     Collections.shuffle(list);
 }
}

我們來看看會是怎麼樣子吧