Tengo una vista de reciclador que se completa con una lista de información.

Cuando hago clic en un elemento, quiero que complete los campos de la actividad. No estoy seguro de cómo hacer esto desde el adaptador.

¿Puede alguien ayudarme por favor?

MainActivity.java:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1 = (Button) findViewById(R.id.btnadd);
    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(getApplicationContext(), AddActivity.class);
            startActivity(i);
        }
    });
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mAdapter = new MovieAdapter(getApplicationContext(), movieList);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);
    prepareMovieData();

}

Clase de adaptador:

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    final Movies movie = moviesList.get(position);
    holder.title.setText(movie.getTitle());
    holder.genre.setText(movie.getGenre());
    holder.year.setText(String.valueOf(movie.getYear()));
    if (selected_position == position) {
        holder.itemView.setBackgroundColor(Color.LTGRAY);
    } else {
        holder.itemView.setBackgroundColor(Color.WHITE);
    }

    holder.itemView.setOnClickListener(v -> {
        //if (position == RecyclerView.NO_POSITION) return;
        notifyItemChanged(selected_position);
        selected_position = position;
        notifyItemChanged(selected_position);
    });
}

Vistas que quiero completar activity_main.xml:

...

<LinearLayout
    android:id="@+id/llname"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/txtmov"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Movie" />

    <EditText
        android:id="@+id/etmov"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout
    android:id="@+id/llgenre"
    android:layout_below="@+id/llname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >

    <TextView
        android:id="@+id/txtgnr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Genre" />

    <EditText
        android:id="@+id/etgnr"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout
    android:id="@+id/llyear"
    android:layout_below="@+id/llgenre"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/txtyr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Year " />

    <EditText
        android:id="@+id/etyr"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number" />

</LinearLayout>

...

Captura de pantalla:

want

Pensé en diferentes maneras de hacerlo, una fue crear un adaptador yo mismo y luego construirlo en la mainactividad, como usar el adaptador de películas que hice. Intenté esto pero no funcionó, luego pensé que debía haber una manera más fácil de hacerlo, pero estoy luchando por encontrar algo.

Stack tampoco me dejó publicar porque dice que hay demasiado código, así que si necesitas algo más solo dame un grito. Dejé las partes que pensé que eran importantes.

¡Gracias de antemano!

0
Erbez 9 sep. 2018 a las 13:54

3 respuestas

La mejor respuesta

En clase de adaptador:

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    final Movies movie = moviesList.get(position);

    ...

    holder.itemView.setTag(movie)

    holder.itemView.setOnClickListener(v -> {

        ...

        MainActivity.updateView((Movies)v.getTag())
    });
}

En MainActivity.java

public static void updateView(Movies movies){

    // Update view by using `findViewById`
}

EDITAR

Este ejemplo debería ayudarte a resolver

error: el método no estático findViewById (int) no puede ser referenciado desde un contexto estático

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private static LinearLayout linearLayout = null;

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

        linearLayout = findViewById(R.id.root_view);
        updateView("Hello World! 2");
    }

    public static void updateView(String text){
        if(linearLayout==null) return;
        ((TextView) linearLayout.findViewById(R.id.tv)).setText(text);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/root_view"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</LinearLayout>
1
daka 9 sep. 2018 a las 11:52

Primero haga Movie clase parcelable

En onBindViewHolder

    holder.itemView.setTag(movie);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Movie movie = (movie) view.getTag();

                Intent intent = new Intent(MainActivity.BROADCAST_ACTION);
                intent.putExtra("ITEM_DATA", movie);
                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
            }
        });

En tu activity

public static final String BROADCAST_ACTION = "BROADCAST_ACTION";

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null &&
                intent.getAction().equals(BROADCAST_ACTION)) {
            Bundle bundle = intent.getExtras();
            if (bundle!=null){
                Movie movie = bundle.getParcelable("ITEM_DATA");
                //Use movie for setting data to your layout
            }
        }
    }
};


@Override
protected void onResume() {
    super.onResume();
    LocalBroadcastManager.getInstance(
            MainActivity.this).registerReceiver(broadcastReceiver, new IntentFilter(BROADCAST_ACTION));
}

@Override
protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(MainActivity.this).unregisterReceiver(broadcastReceiver);
}
0
prashant17 9 sep. 2018 a las 11:24

Puedes hacerlo :

1- Primero crea una interfaz como esta

public interface OnMovieClickListener {

      void onClick(int movieId);

}

2- Segundo, tu actividad debe implementar esta interfaz

3- En tu ViewHolder Constructor debes hacer algo como esto:

ViewHolder(View itemView) {
      itemView.setOnClickListener(new OnClickListener() {
              public void onClick() {
                      listener.onClick(this.getLayoutPosition());
              }
      }
}

Y el constructor de tu adaptador es así:

private OnMovieClickListener listener;
public adapter(OnMovieClickListener listener) {
         this.listener = listener
}

Tenga en cuenta que la clase interna de su lector no debe ser estática. finalmente pase su actividad a su adaptador;

Adapter adapter = new Adapter(this);
1
Shayan Tabatabaee 9 sep. 2018 a las 11:50