Android 通过单击回收器视图中的项目更新活动中的视图
我有一个recycler视图,其中填充了一个列表(如果有)信息 当我单击一个项目时,我希望它填充活动上的字段。我不确定如何从适配器执行此操作 有人能帮我吗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
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几分钟后,我将提供一个示例。