Java Android Studio-如何从RecyclerView中的EditText获取数据并将其放入主活动中的ArrayList?
因此,我有一个由EditText组成的RecyclerView,它使用ArrayList作为数据集,编辑EditText时,我希望ArrayList也能更新,我希望能够在主要活动中使用它。目前,我尝试实现一个TextChangedListener,但我不知道如何获取数据并将其传输到我的列表中。代码如下: 主要活动:Java Android Studio-如何从RecyclerView中的EditText获取数据并将其放入主活动中的ArrayList?,java,android,android-recyclerview,Java,Android,Android Recyclerview,因此,我有一个由EditText组成的RecyclerView,它使用ArrayList作为数据集,编辑EditText时,我希望ArrayList也能更新,我希望能够在主要活动中使用它。目前,我尝试实现一个TextChangedListener,但我不知道如何获取数据并将其传输到我的列表中。代码如下: 主要活动: public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; p
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
public ArrayList playerList;
private Button runItButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerList = new ArrayList();
for(int i = 0; i < 4; i++){
playerList.add("Player " + (i + 1));
}
runItButton = findViewById(R.id.buttonStartGame);
runItButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DrinktasksActivity.class);
intent.putExtra("playerList", playerList);
startActivity(intent);
}
});
recyclerView = findViewById(R.id.recyclyerViewNames);
MyAdapter myAdapter = new MyAdapter(this, playerList);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
public void addPlayers(View view){
playerList.add("Player " + (playerList.size() + 1));
recyclerView.getAdapter().notifyDataSetChanged();
}
public类MainActivity扩展了AppCompatActivity{
私人回收站;
公共阵列主义剧作家;
私人按钮runItButton;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerList=newarraylist();
对于(int i=0;i<4;i++){
playerList.add(“Player”+(i+1));
}
runItButton=findViewById(R.id.buttonStartGame);
runItButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向意向=新意向(MainActivity.this、DrinktasksActivity.class);
意图。putExtra(“玩家列表”,玩家列表);
星触觉(意向);
}
});
recyclerView=findViewById(R.id.RecycleryViewNames);
MyAdapter MyAdapter=新的MyAdapter(这是playerList);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
}
公共void addPlayers(视图){
添加(“Player”+(playerList.size()+1));
RecycleView.getAdapter().notifyDataSetChanged();
}
}
适配器:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
Context context;
ArrayList playerList;
public MyAdapter(Context ct, List players){
context = ct;
playerList = (ArrayList) players;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.enter_name, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String current = playerList.get(position).toString();
holder.editText.setHint(current);
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// The code I assume should go here but I don't know how to implement
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public int getItemCount() {
return playerList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
EditText editText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
editText = itemView.findViewById(R.id.editname);
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{
语境;
ArrayList playerList;
公共MyAdapter(上下文ct,列出玩家){
上下文=ct;
playerList=(ArrayList)玩家;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
LayoutFlater充气机=LayoutFlater.from(上下文);
视图=充气机。充气(R.layout.enter\u name,parent,false);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
字符串当前值=playerList.get(位置).toString();
holder.editText.setHint(当前);
holder.editText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
//我假设代码应该放在这里,但我不知道如何实现
}
@凌驾
公共无效后文本已更改(可编辑){
}
});
}
@凌驾
public int getItemCount(){
返回playerList.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
编辑文本编辑文本;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
editText=itemView.findViewById(R.id.editname);
}
}
}您所要做的就是使用编辑edittext的索引和新文本是什么来实现对活动的自定义回调 在适配器内部创建回调接口
public interface TextChangeCallback {
void textChangedAt(int position, String text);
}
public MyAdapter(Context ct, List players,TextChangeCallback callback){
context = ct;
playerList = (ArrayList) players;
this.callback = callback;
}
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.equals("")){
return;
}
data.set(position, String.valueOf(s));
callback.textChangedAt(position, String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
});
MyAdapter myAdapter = new MyAdapter(this, playerList, new MyAdapter.TextChangeCallback() {
@Override
public void textChangedAt(int position, String text) {
playerList.set(position, text);
Log.d("UPDATED LIST : ", String.valueOf(data));
}
});
recyclerView.setAdapter(myAdapter);
通过构造函数将接口实现传递给适配器
public interface TextChangeCallback {
void textChangedAt(int position, String text);
}
public MyAdapter(Context ct, List players,TextChangeCallback callback){
context = ct;
playerList = (ArrayList) players;
this.callback = callback;
}
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.equals("")){
return;
}
data.set(position, String.valueOf(s));
callback.textChangedAt(position, String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
});
MyAdapter myAdapter = new MyAdapter(this, playerList, new MyAdapter.TextChangeCallback() {
@Override
public void textChangedAt(int position, String text) {
playerList.set(position, text);
Log.d("UPDATED LIST : ", String.valueOf(data));
}
});
recyclerView.setAdapter(myAdapter);
每当您使用TextWatcher编辑文本时,触发对活动的回调
public interface TextChangeCallback {
void textChangedAt(int position, String text);
}
public MyAdapter(Context ct, List players,TextChangeCallback callback){
context = ct;
playerList = (ArrayList) players;
this.callback = callback;
}
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.equals("")){
return;
}
data.set(position, String.valueOf(s));
callback.textChangedAt(position, String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
});
MyAdapter myAdapter = new MyAdapter(this, playerList, new MyAdapter.TextChangeCallback() {
@Override
public void textChangedAt(int position, String text) {
playerList.set(position, text);
Log.d("UPDATED LIST : ", String.valueOf(data));
}
});
recyclerView.setAdapter(myAdapter);
将此接口实现添加到适配器中
public interface TextChangeCallback {
void textChangedAt(int position, String text);
}
public MyAdapter(Context ct, List players,TextChangeCallback callback){
context = ct;
playerList = (ArrayList) players;
this.callback = callback;
}
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.equals("")){
return;
}
data.set(position, String.valueOf(s));
callback.textChangedAt(position, String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
});
MyAdapter myAdapter = new MyAdapter(this, playerList, new MyAdapter.TextChangeCallback() {
@Override
public void textChangedAt(int position, String text) {
playerList.set(position, text);
Log.d("UPDATED LIST : ", String.valueOf(data));
}
});
recyclerView.setAdapter(myAdapter);
现在,当您从recyclerview编辑edittext时,将更新适配器和活动中的ArrayList
您可以从中找到完整的实现,我可以告诉您如何将数据从适配器传递到主类。但在addTextChangedListener中,每次文本更改时,都会调用该函数。你到底想要什么?我希望ArrayList由EditText中的数据组成,如果这有意义的话。