【问题标题】:Android Studio - How to get data from an EditText in a RecyclerView and put them into an ArrayList in the main activity?Android Studio - 如何从 RecyclerView 中的 EditText 获取数据并将它们放入主活动中的 ArrayList 中?
【发布时间】:2021-05-12 08:59:19
【问题描述】:

所以我有一个由 EditTexts 组成的 RecyclerView,它使用 ArrayList 作为其数据集,当编辑 EditTexts 时,我希望该 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 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);
    }
}

}

【问题讨论】:

  • 我知道如何将数据从适配器传递到主类。但是在 addTextChangedListener 中,每次文本更改时都会调用该函数。你到底想要什么?
  • 如果有意义的话,我希望 ArrayList 包含 editTexts 中的数据。

标签: java android android-recyclerview


【解决方案1】:

您所要做的就是使用编辑文本的索引以及新文本是什么来为您的活动实现自定义回调。

在适配器内部创建回调接口

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

使用 TextWatcher 编辑文本时触发活动回调

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 编辑编辑文本时,这将更新适配器和活动中的 ArrayList。

你可以从this link找到完整的实现

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2021-10-06
    • 2021-12-07
    • 2020-11-24
    • 2017-08-25
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多