Android 通过单击回收器视图中的项目更新活动中的视图

Android 通过单击回收器视图中的项目更新活动中的视图,android,android-recyclerview,Android,Android Recyclerview,我有一个recycler视图,其中填充了一个列表(如果有)信息 当我单击一个项目时,我希望它填充活动上的字段。我不确定如何从适配器执行此操作 有人能帮我吗 MainActivity.java: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button

我有一个recycler视图,其中填充了一个列表(如果有)信息

当我单击一个项目时,我希望它填充活动上的字段。我不确定如何从适配器执行此操作

有人能帮我吗

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();

}
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);
    }
}
适配器类:

@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);
    });
}
我要填写的视图
activity\u 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>

...
。。。
...
截图:

我想到了不同的方法,一种是我自己创建一个适配器,然后在main活动中构建它,就像使用我制作的moviesAdapter一样。我试过了,但没有成功,然后我想一定有更简单的方法,但我正在努力寻找任何东西

Stack也不让我发布,因为它说有太多的代码,所以如果你还需要什么,就给我一个叫喊。我留下了我认为重要的部分

提前谢谢你

在适配器类中:

@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())
    });
}
MainActivity.java中

public static void updateView(Movies movies){

    // Update view by using `findViewById`
}
编辑

这个示例应该可以帮助您解决

错误:无法从静态上下文引用非静态方法findViewById(int)

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();

}
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\u 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>

在适配器类中:

@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())
    });
}
MainActivity.java中

public static void updateView(Movies movies){

    // Update view by using `findViewById`
}
编辑

这个示例应该可以帮助您解决

错误:无法从静态上下文引用非静态方法findViewById(int)

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();

}
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\u 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>

第一次制作
电影
类包裹

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);
            }
        });
在您的
活动中

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

首先制作
电影
类包裹

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);
            }
        });
在您的
活动中

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);
}
您可以这样做:

1-首先创建一个这样的接口

public interface OnMovieClickListener {

      void onClick(int movieId);

}
2秒你的活动应该实现这个接口

3-在您的
ViewHolder
构造函数中,您应该执行以下操作:

ViewHolder(View itemView) {
      itemView.setOnClickListener(new OnClickListener() {
              public void onClick() {
                      listener.onClick(this.getLayoutPosition());
              }
      }
}
private OnMovieClickListener listener;
public adapter(OnMovieClickListener listener) {
         this.listener = listener
}
适配器的构造函数如下所示:

ViewHolder(View itemView) {
      itemView.setOnClickListener(new OnClickListener() {
              public void onClick() {
                      listener.onClick(this.getLayoutPosition());
              }
      }
}
private OnMovieClickListener listener;
public adapter(OnMovieClickListener listener) {
         this.listener = listener
}
请注意,viewholder内部类不应是静态的。 最后将活动传递给适配器

Adapter adapter = new Adapter(this);
您可以这样做:

1-首先创建一个这样的接口

public interface OnMovieClickListener {

      void onClick(int movieId);

}
2秒你的活动应该实现这个接口

3-在您的
ViewHolder
构造函数中,您应该执行以下操作:

ViewHolder(View itemView) {
      itemView.setOnClickListener(new OnClickListener() {
              public void onClick() {
                      listener.onClick(this.getLayoutPosition());
              }
      }
}
private OnMovieClickListener listener;
public adapter(OnMovieClickListener listener) {
         this.listener = listener
}
适配器的构造函数如下所示:

ViewHolder(View itemView) {
      itemView.setOnClickListener(new OnClickListener() {
              public void onClick() {
                      listener.onClick(this.getLayoutPosition());
              }
      }
}
private OnMovieClickListener listener;
public adapter(OnMovieClickListener listener) {
         this.listener = listener
}
请注意,viewholder内部类不应是静态的。 最后将活动传递给适配器

Adapter adapter = new Adapter(this);


你能用->解释一下吗。例如单击添加按钮->[活动名称]开始->执行此操作->然后单击此操作。@daka单击recyclerview中的项目->用来自的信息填充下面的字段item@daka都在同一个活动上什么是
b3
b2
?在
onBindViewHolder
中有3个单击侦听器,您希望在哪个click listener中开始填充下面的视图?您能用->解释一下吗。例如单击添加按钮->[活动名称]开始->执行此操作->然后单击此操作。@daka单击recyclerview中的项目->用来自的信息填充下面的字段item@daka都在同一个活动上什么是
b3
b2
?在
onBindViewHolder
中有3个单击侦听器,您希望在哪个click listener中开始填充下面的视图?对于这种情况,这都是不必要的,请参阅我的答案。对于这种情况,这都是不必要的,请参阅我的答案。我无法设置任何内容,它一直给我一个静态错误,例如:
EditText et1=(EditText)findViewById(R.id.etmov)
给了我这样一个错误:
错误:不能从静态上下文引用非静态方法findViewById(int)
将视图存储在可用于整个类的变量中。请将上下文存储在变量中,或存储父视图。然后,您可以执行查看.findViewById
或上下文.findViewById
@Erbez给我几分钟,我会提供一个示例。我无法设置任何内容,它不断给我一个静态错误,例如:
EditText et1=(EditText)findViewById(R.id.etmov)
给了我这样一个错误:
错误:不能从静态上下文引用非静态方法findViewById(int)
将视图存储在可用于整个类的变量中。请将上下文存储在变量中,或存储父视图。然后您可以执行
view.findViewById
context.findViewById
@Erbez几分钟后,我将提供一个示例。