簡體   English   中英

如何將編輯文本值從適配器傳遞到活動?

[英]How to pass edit text value from adapter to activity?

我有一個回收器視圖適配器,它在 edittext 中接受用戶的輸入。 我想將這些值作為列表傳遞回存在回收器視圖的活動。 我需要活動中的此列表作為參數發送到 api 到 retrofit。

  1. 創建一個這樣的界面:
interface IList {
   void addToList(String editTextValue);
}
  1. 在您的活動中實現此接口:
class MainActivity extends AppCompatActivity implements IList {

    @Override
    public void addToList(String editTextValue) {
        //TODO("logic for adding to list and sending")
    }
}
  1. 添加到 Adapter 的構造函數 Activity,實現IList接口,作為參數:
public Adapter(IList listener){
   this.listener = listener;
}
  1. 在您的適配器中執行addToList方法:
    @Override 
    public void onBindViewHolder(NewViewHolder holder, int position) {
        holder.sendButton.setOnClickListener .setOnClickListener(v -> {
            String newText = holder.editText.text.toString()
            listener.addToList(newText)
        });
    }

有一個工作樣本。

MainActivity.java

```    
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;

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

public class MainActivity extends AppCompatActivity {

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

        Adapter adapter = new Adapter();
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setAdapter(adapter);

        EditText editText = findViewById(R.id.editText);
        editText.setOnEditorActionListener((textView, actionId, keyEvent) -> {
            boolean handled = false;
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // add item
                adapter.addItem(editText.getText().toString());
                // clear text input
                textView.setText("");
                handled = true;
            }
            return handled;
        });
    }
}
    
```

activity_main.xml

```
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="Insert text.."
        android:imeOptions="actionDone"
        android:inputType="text"
        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintVertical_chainStyle="packed" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText" />

</androidx.constraintlayout.widget.ConstraintLayout>

```

適配器.java

```    
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

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

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    private List<String> items = new ArrayList<>();

    @NonNull
    @Override
    public Adapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(android.R.layout.test_list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Adapter.ViewHolder holder, int position) {
        String currentItem = items.get(position);
        holder.textView.setText(currentItem);
    }

    public void addItem(String item) {
        // add at first position - replace with your desired index
        int index = 0;
        this.items.add(index, item);
        notifyItemInserted(index);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        protected TextView textView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(android.R.id.text1);
        }
    }
}

You can use the "done" key on the keyboard to notify the adapter that an item has been added.
To display the "done" button in the xml it is necessary to use these two instructions in the edittext

    android:imeOptions="actionDone"
    android:inputType="text"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM