Знакомлюсь с RecyclerView, у меня получилось реализовать при нажатии на элемент отображать номер позиции. Но я не могу понять, как написать этот идентификационный номер в EditText, расположенном в действии.
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_file_signature, parent, false);
final ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = holder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
final FileInfoSignature fileInfo = values.get(position);
Toast.makeText(v.getContext(), fileInfo.getFileName(),Toast.LENGTH_SHORT).show();
//there is a mistake
EditText text =(EditText) parent.findViewById(R.id.etIntentsDataToSign);
text.setText(pathFile);
return holder;
}
мой 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">
<androidx.recyclerview.widget.RecyclerView
android:id = "@+id/sf_list_data"
android:layout_width = "match_parent"
android:layout_height = "200dp"
android:layout_marginBottom = "10dp"
android:background = "@color/Whitesmoke"
android:scrollbars = "vertical"
tools:ignore = "MissingConstraints" />
<EditText
android:id = "@+id/etIntentsDataToSign"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:singleLine = "true"
app:layout_constraintEnd_toStartOf = "@+id/sf_list_data"
app:layout_constraintStart_toEndOf = "@+id/sf_list_data"
app:layout_constraintTop_toBottomOf = "@+id/sf_list_data" />
</androidx.constraintlayout.widget.ConstraintLayout>
Вам нужно быть более «ознакомленным». Вот простое объяснение. Ваш основной макет содержит RecyclerView
и EditText
. Вы инициализируете их как внутри их активности, так и фрагмента:
recyclerView = findViewById(R.id.sf_list_data);
editText = findViewById(R.id.etIntentsDataToSign);
// RecyclerView stuff here
// your edit text:
editText.setText("Hi world");
Аналогично, элемент/элемент RecyclerView
, в вашем случае это item_file_signature
. Например, этот элемент содержит TextView
, который можно инициализировать внутри ViewHolder
адаптера:
public class ViewHolder extends RecyclerView.ViewHolder {
TextView itemTitle;
public ViewHolder(View view) {
super(view);
itemTitle = view.findViewById(R.id.text_title);
}
}
Затем внутри onBindViewHolder:
viewHolder.itemTitle.setText("Hello World");
NullPointerException
, очевидно, потому что, как я уже сказал, оно не является частью файла макета адаптера.Обновлено: чтобы передать данные из вашего адаптера в MainActivity, в вашем адаптере создайте интерфейс onClickListener:
public interface myOnClickListener {
void onRecyclerViewItemClicked(String text);
}
Объявите это следующим образом:
private myOnClickListener myClickListener;
И создайте публичный метод, который будет вызываться из MainActivity:
public void setMyOnClickListener(myOnClickListener myClickListener) {
this.myClickListener = myClickListener;
}
В onBindViewHolder:
int itemPosition = getAdapterPosition();
final FileInfoSignature fileInfo = values.get(position);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (myClickListener != null) {
Toast.makeText( context , fileInfo.getFileName(),Toast.LENGTH_SHORT).show();
myOnClickListener.onRecyclerViewItemClicked(fileInfo.getFileName() );
}
}
});
Наконец, в вашей деятельности:
MainActivity implements YourAdapter.myOnClickListener
{
// after you initialize your adapter
adapter.setMyOnClickListener(this);
}
@Override
public void onRecyclerViewItemClicked(String text) {
editText.setText ( text );
}
Насколько я понимаю таким образом мы меняем заголовок выбранного элемента, но нельзя этот заголовок передать в EditText которого нет в RecyclerView?
вам нужно передать
listener
на вашactivity
из адаптера, см. этот пример android.jlelse.eu/…. и в действие установить значение его edittext