在运行时从数组列表中添加和删除用户并保留项目详细信息

时间:2015-09-25 09:41:30

标签: java android arraylist iterator android-linearlayout

我有一个游戏我正在开发游戏,在游戏开始之前,有一个选项可以添加或删除游戏中的玩家个人资料。 这个想法是应用程序所有者可以添加或删除游戏中的玩家个人资料,以便他们可以在同一个设备上独奏或与朋友一起玩。

这是此活动的主屏幕:

enter image description here

正如你可以看到它的自我解释,所有已保存的用户都被加载,在游戏开始之前,必须选择至少一个玩家使用添加或删除按钮来玩游戏。

如前所述,如果只有一个配置文件保存到设备,则此功能可以正常工作。

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

对这个问题的任何帮助都会很棒,我也会对问题标题进行说明,因为我不知道这个问题会在哪里发生。

2 个答案:

答案 0 :(得分:1)

虽然我知道将您的方法分离为单一职责不会直接解决问题,但它会使您更容易阅读和调试,因为您可以隔离用户的删除和添加。

问题的出现很可能是做得太多,这会在代码中增加额外的条件和复杂的逻辑,这是可以避免的。

我首先将AddRemoveUser(...)重构为两个只执行一项操作的方法:addUser(...)removeUser(...)。只是这样做可以解决问题,因为你将简化代码并删除条件检查和新方法中不必要的东西。

答案 1 :(得分:0)

您应该使用break;AddRemoveUser(username,id,add,thisPlayer);之后停止执行。因此,无论何时添加/删除用户,它都将停止迭代。无论如何,你一次要添加/删除单个用户。