Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio-如何从RecyclerView中的EditText获取数据并将其放入主活动中的ArrayList?_Java_Android_Android Recyclerview - Fatal编程技术网

Java Android Studio-如何从RecyclerView中的EditText获取数据并将其放入主活动中的ArrayList?

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

因此,我有一个由EditText组成的RecyclerView,它使用ArrayList作为数据集,编辑EditText时,我希望ArrayList也能更新,我希望能够在主要活动中使用它。目前,我尝试实现一个TextChangedListener,但我不知道如何获取数据并将其传输到我的列表中。代码如下:

主要活动:

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中的数据组成,如果这有意义的话。