【问题标题】:How to get a string value from an EditText in RecyclerView?如何从 RecyclerView 中的 EditText 获取字符串值?
【发布时间】:2018-03-01 19:22:43
【问题描述】:

我正在尝试从我的活动中的回收站视图中获取玩家姓名,其中有 X 个编辑文本。我尝试使用TextChangedListener 将名称添加到玩家名称的ArrayList,但我得到了每一步(即:B、Bo、Bob、D、Da、Dav、Davi、David),我试图只获取 final 字符串值(只有全名?我该如何修改 TextChangedListener ?还有其他方法吗?

干杯;

package com.olirwin.spartacus.deutsch;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class Main2Activity extends AppCompatActivity {

    RecyclerView mPlayerList;
    List<String> mPlayerNames;
    PlayerAdapter mAdapter;
    EditText mInput;
    Button mCreateButton;
    Button submitButton;
    ArrayList<String> names;


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

        mPlayerNames = new ArrayList<>();

        // setup recycler view
        mPlayerList = findViewById(R.id.player_list);
        mPlayerList.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new PlayerAdapter();
        mPlayerList.setAdapter(mAdapter);

        // setup input EditText
        mInput = findViewById(R.id.input);

        // setup Create button
        mCreateButton = findViewById(R.id.create_button);
        mCreateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // clear old player names
                mPlayerNames.clear();

                // read user input: number of player:
                String input = mInput.getText().toString();
                int numberOfPlayer;
                try {
                    numberOfPlayer = Integer.parseInt(input);
                } catch (NumberFormatException e) {
                    Toast.makeText(Main2Activity.this, "Invalid input!!!", Toast.LENGTH_SHORT).show();
                    return;
                }
                for (int i = 0; i < numberOfPlayer; ++i) {
                    mPlayerNames.add("Player #" + (i + 1));
                }

                // make change on recycler view
                mAdapter.notifyDataSetChanged();

                // dismiss keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(mInput.getWindowToken(), 0);

            }
        });

        //setup submit

        submitButton = findViewById(R.id.submit);
        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                names = mAdapter.getNames();
                Intent intent = new Intent(v.getContext(), Score.class);
                intent.putStringArrayListExtra("names", names);
                v.getContext().startActivity(intent);
            }
        });

    }

    private class PlayerAdapter extends RecyclerView.Adapter<PlayerAdapter.PlayerHolder> {

        private ArrayList<String> names;
        private String string;

        public PlayerAdapter() {
            names = new ArrayList<>();
        }

        @Override
        public PlayerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(Main2Activity.this).inflate(R.layout.item_layout, parent, false);
            return new PlayerHolder(v);
        }


        @Override
        public void onBindViewHolder(final PlayerHolder holder, int position) {
            holder.bind(mPlayerNames.get(position));
            holder.mPlayerName.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    //blank
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    //blank;
                }

                @Override
                public void afterTextChanged(Editable s) {
                    names.add(holder.mPlayerName.getText().toString());
                }
            });

        }

        @Override
        public int getItemCount() {
            return mPlayerNames.size();
        }

        public ArrayList<String> getNames(){
            return this.names;
        }

        public class PlayerHolder extends RecyclerView.ViewHolder {

            TextView mPlayerLabel;
            EditText mPlayerName;


            public PlayerHolder(View itemView) {
                super(itemView);
                mPlayerLabel = itemView.findViewById(R.id.player_label);
                mPlayerName = itemView.findViewById(R.id.player_name);
            }

            public void bind(String playerName) {
                mPlayerLabel.setText(playerName);
                mPlayerName.setHint("Name of " + playerName);
            }
        }
    }
}

【问题讨论】:

标签: android android-recyclerview android-edittext


【解决方案1】:

创建一个以Item位置为key的HashMap

HashMap<Integer, String> map = new HashMap<>;

改变你里面的条目

@Override
public void afterTextChanged(Editable s) {
   String value = map.get(position);  // here position is the key
if (value != null) {
    map.put(position, holder.mPlayerName.getText().toString());
} else {
    // Key might be present...
    if (map.containsKey(key)) {
       // Okay, there's a key but the value is null
    } else {
       // Definitely no such key
    }
}
}

然后使用 HashMap 中的 get() 方法获取 HashMap 值。

【讨论】:

    【解决方案2】:

    请修改适配器中的代码如下:

    String[] playerNames = new String[names.size];
    
    @Override
    public void onBindViewHolder(final PlayerHolder holder, int position)
    {
        holder.bind(mPlayerNames.get(position));
        holder.mPlayerName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    //blank
                }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                    //blank;
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                playerNames[i] = s.toString().trim();
            }
            });
    
        }
    
    public ArrayList<String> getNames(){
    
        ArrayList<String> pNameList = new ArrayList<>();
    
        for(int i=0; i<playerNames.length; i++){
            pNameList.add(playerNames[i]);
        }        
       return pNameList;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2021-12-07
      • 1970-01-01
      • 2015-09-10
      • 2012-11-15
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多