2015-09-25 25 views
1

我有一款遊戲,我正在開發一款遊戲,在遊戲開始之前有一個選項可以從遊戲中添加或刪除玩家檔案。 這個想法是,應用程序所有者可以添加或刪除玩家配置文件到遊戲中,以便他們可以在同一臺設備上獨奏或與朋友一起玩。在運行時從陣列列表中添加和刪除用戶並保留項目詳細信息

這是本次活動的主屏:

enter image description here

正如你可以看到它很自我explainatry,所有保存的用戶加載和比賽開始至少一名球員之前,必須選擇播放使用添加或刪除按鈕的遊戲。

如前所述,如果只有一個配置文件保存到設備,此功能可以正常工作。

enter image description here

用戶觸摸之後添加按鈕該玩家然後移動到用戶播放器部和詳細信息存儲在活躍玩家陣列英寸

我遇到的問題是當您有多個玩家保存在數據庫中。當您再次嘗試相同的功能時,只會添加第二個播放器。像這樣:

enter image description here

無論哪個用戶添加只有最後一個用戶似乎是跨移動。這可能是我錯過的一件非常簡單的事情,但我一直在這裏停留一段時間。

顯示用戶功能:

final HashMap<String,String> users = db.getUsers(); 
     if(users.size() > 0){ 
      noSavedPlayers.setVisibility(View.GONE); 
     } 
     Iterator it = users.entrySet().iterator(); 
     int userCount = 0; 
     while(it.hasNext()){ 
      Map.Entry pair = (Map.Entry) it.next(); 
      final String id = pair.getKey().toString(); 
      final String username = pair.getValue().toString(); 
      //add this view to settings 
      usersClass.addToGameList(PlayerSelect.this, allUsers, username, id, new AddUserCallback() { 
       @Override 
       public void addUser(Boolean add, View thisPlayer) { 
        AddRemoveUser(username,id,add,thisPlayer); 
       } 
      }); 
      userCount++; 
      it.remove(); 
     } 

private void AddRemoveUser(final String username, final String id, Boolean add, View thisPlayer){ 
     Log.d("USERNAME",username + " is"); 
     Boolean isAdded; 
     if(activePlayers.size() == 0){ 
      isAdded = false; 
     } else { 
      isAdded = activePlayers.contains(username); 
     } 
     if(add){ 
      //check if player is allready add to the game 
      if(!isAdded){ 
       //add this user to the game 
       //remove form all players list 
       activePlayers.add(username); 
       activeIDs.add(id); 
       allUsers.removeView(thisPlayer); 
       usersClass.addToGameList(PlayerSelect.this, activeLayout, username, id, new AddUserCallback() { 
        @Override 
        public void addUser(Boolean add, View thisPlayer) { 
         if(add){ 
          AddRemoveUser(username,id,true,thisPlayer); 
         } else { 
          AddRemoveUser(username,id,false,thisPlayer); 
         } 
        } 
       }); 
      } 
     } else { 
      if(isAdded){ 
       //remove this user to the game 
       //add back to all players list 
       int current = activePlayers.indexOf(username); 
       activePlayers.remove(current); 
       activeIDs.remove(current); 
       activeLayout.removeView(thisPlayer); 
       usersClass.addToGameList(PlayerSelect.this, allUsers, username, id, new AddUserCallback() { 
        @Override 
        public void addUser(Boolean add, View thisPlayer) { 
         if(add){ 
          AddRemoveUser(username,id,true,thisPlayer); 
         } else { 
          AddRemoveUser(username,id,false,thisPlayer); 
         } 
        } 
       }); 
      } 
     } 
     Log.d("VIEW",activePlayers.size() + ""); 
     noActivePlayers.setVisibility((activePlayers.size() > 0)? View.GONE : View.VISIBLE); 
     noSavedPlayers.setVisibility((allUsers.getChildCount() > 0) ? View.GONE : View.VISIBLE); 
    } 

usersClass.addToGameList功能:

public void addToGameList(final Context context, final LinearLayout view, final String UserName, final String id, AddUserCallback callback){ 
     delegate = callback; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final View user = inflater.inflate(R.layout.user_add, null); 

     //set data 
     final TextView username = (TextView) user.findViewById(R.id.username); 
     username.setText(UserName); 
     Button save = (Button) user.findViewById(R.id.saveChanges); 
     final Button delete = (Button) user.findViewById(R.id.deleteUserBtn); 

     delete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("GAME","User is to be removed from this game."); 
       delegate.addUser(false, user); 
      } 
     }); 
     save.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("GAME","User to be added to the game"); 
       delegate.addUser(true, user); 
      } 
     }); 
     view.addView(user); 

    } 

充分的活動:

package r1d.org.uk.oiaskatedice; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 

import LocalDatabase.DatabaseHandler; 

/** 
* Created by paul on 21/09/2015. 
*/ 
public class PlayerSelect extends Activity { 
    private ProFeatures PF; 
    private DatabaseHandler db; 
    private int maxPlayers = 3; 
    private LinearLayout activeLayout; 
    private LinearLayout allUsers; 
    private TextView noActivePlayers; 
    private TextView noSavedPlayers; 
    private ArrayList<String> activeIDs; 
    private ArrayList<String> activePlayers; 
    private Users usersClass; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.player_select); 
     db = new DatabaseHandler(this); 
     PF = new ProFeatures(this); 
     activeIDs = new ArrayList<String>(); 
     activePlayers = new ArrayList<>(); 
     activeLayout = (LinearLayout) findViewById(R.id.activePlayers); 
     allUsers = (LinearLayout) findViewById(R.id.allPlayers); 

     noActivePlayers = (TextView) findViewById(R.id.noActivePlayers); 
     noSavedPlayers = (TextView) findViewById(R.id.noSavedPlayers); 

     PF.checkForPro(new IsPro() { 
      @Override 
      public void isPro(Boolean isPro) { 
       if(!isPro){ 
        new AdManager(PlayerSelect.this); 
       } else { 
        maxPlayers = 20; 
       } 
      } 
     }); 
     //get tricks 
     Bundle extras = getIntent().getExtras(); 
     if(extras.getString("Tricks")instanceof String){ 
      final String usedTricks = extras.getString("Tricks"); 
     } else { 
      final String[] usedTricks = extras.getStringArray("Tricks"); 
     } 
     //show active players 
     //show all players 
     usersClass = new Users(); 
     final HashMap<String,String> users = db.getUsers(); 
     if(users.size() > 0){ 
      noSavedPlayers.setVisibility(View.GONE); 
     } 
     Iterator it = users.entrySet().iterator(); 
     int userCount = 0; 
     while(it.hasNext()){ 
      Map.Entry pair = (Map.Entry) it.next(); 
      final String id = pair.getKey().toString(); 
      final String username = pair.getValue().toString(); 
      //add this view to settings 
      usersClass.addToGameList(PlayerSelect.this, allUsers, username, id, new AddUserCallback() { 
       @Override 
       public void addUser(Boolean add, View thisPlayer) { 
        AddRemoveUser(username,id,add,thisPlayer); 
       } 
      }); 
      userCount++; 
      it.remove(); 
     } 
     //add more players 
     //check for upgrade 
     //gibe option to upgrage if needed 
     //save all players to an array 
     //save changes to saved player names 
     //start game when all players are added 

    } 
    private void AddRemoveUser(final String username, final String id, Boolean add, View thisPlayer){ 
     Log.d("USERNAME",username + " is"); 
     Boolean isAdded; 
     if(activePlayers.size() == 0){ 
      isAdded = false; 
     } else { 
      isAdded = activePlayers.contains(username); 
     } 
     if(add){ 
      //check if player is allready add to the game 
      if(!isAdded){ 
       //add this user to the game 
       //remove form all players list 
       activePlayers.add(username); 
       activeIDs.add(id); 
       allUsers.removeView(thisPlayer); 
       usersClass.addToGameList(PlayerSelect.this, activeLayout, username, id, new AddUserCallback() { 
        @Override 
        public void addUser(Boolean add, View thisPlayer) { 
         if(add){ 
          AddRemoveUser(username,id,true,thisPlayer); 
         } else { 
          AddRemoveUser(username,id,false,thisPlayer); 
         } 
        } 
       }); 
      } 
     } else { 
      if(isAdded){ 
       //remove this user to the game 
       //add back to all players list 
       int current = activePlayers.indexOf(username); 
       activePlayers.remove(current); 
       activeIDs.remove(current); 
       activeLayout.removeView(thisPlayer); 
       usersClass.addToGameList(PlayerSelect.this, allUsers, username, id, new AddUserCallback() { 
        @Override 
        public void addUser(Boolean add, View thisPlayer) { 
         if(add){ 
          AddRemoveUser(username,id,true,thisPlayer); 
         } else { 
          AddRemoveUser(username,id,false,thisPlayer); 
         } 
        } 
       }); 
      } 
     } 
     Log.d("VIEW",activePlayers.size() + ""); 
     noActivePlayers.setVisibility((activePlayers.size() > 0)? View.GONE : View.VISIBLE); 
     noSavedPlayers.setVisibility((allUsers.getChildCount() > 0) ? View.GONE : View.VISIBLE); 
    } 
} 

在這個問題上的任何幫助將是巨大的,我也applogise爲問題的標題,因爲我真的不知道這個問題會在哪裏。

+0

我認爲你最好有獨立的方法:addUser和removeUser。如果沒有其他問題,調試問題會更容易,對於一種方法來說,最好有一個責任。 – ChiefTwoPencils

+0

它是有道理的拆分分開的添加和刪除功能,但當然這將不會對最終結果產生影響 –

+1

@ChiefTwoPencils我做到了這一點,它工作得很好,花了一點工作,但代碼也更清潔了。你應該發佈,作爲回答 –

回答

1

雖然我知道將您的方法分解爲單個職責不會直接解決問題,但它會使讀取和調試更容易,因爲您可以隔離刪除和添加用戶。

最可能的問題是如何做太多,這會增加額外的條件和複雜的代碼中的邏輯可以避免。

我會從重構AddRemoveUser(...)開始,以兩種方法只做一件事:addUser(...)removeUser(...)。只要這樣做可能會解決了這個問題,因爲您將簡化代碼並刪除條件檢查和在新方法中不需要的東西。

0

您應該使用break;AddRemoveUser(username,id,add,thisPlayer);之後停止執行。所以無論何時添加/刪除用戶都會停止迭代。無論如何,你將一次添加/刪除單個用戶。

+0

我嘗試添加break;這隻會殺死Iterator,並且只會從數據庫中添加第一個用戶 –

相關問題