gpt4 book ai didi

java - RecyclerView - 获取选定的位置并将该位置传递给另一个 Activity ,在该 Activity 中将显示与选定的特定项目相同的列表

转载 作者:行者123 更新时间:2023-11-30 10:06:47 24 4
gpt4 key购买 nike

我已经为 RecyclerView 声明了一个 ViewModel.class 一个 Adapter 并且我已经解析到 MainActivity 和另一个 Activity 所以我有两个 Activity 使用相同的适配器。

我可以在两个 Activity 中显示解析的数据,但问题是我无法将所选项目的数据带到 MainActivity 然后设置为 btnSearch 进行点击,这样我就可以分享在 Activity 之间来自所选项目的数据。

每次打开应用程序时,都会选择第一个项目。我想要实现的是。

  1. 将项目位置获取到 MainActivity,这样当我点击按钮搜索时,selectedItem 的数据将转到 intent.putExtra,然后在另一个 Activity 获取数据。
  2. 如果我点击第二个项目并转到另一个 Activity,则会选择相同的项目。

这是我到目前为止尝试过的方法。

SearchEngineAdapter.class

public class SearchEngineAdapter extends RecyclerView.Adapter<SearchEngineAdapter.ViewHolder> {
private int selectedItem = 0;
private static RecyclerViewClickListener itemListener;

private Context context;
ArrayList<SearchEngine> arrayList = new ArrayList<>();

public SearchEngineAdapter(Context context, ArrayList<SearchEngine> arrayList, int selectedItem) {
this.context = context;
this.arrayList = arrayList;
this.selectedItem = selectedItem;
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int i) {
holder.tvIcon.setImageResource(arrayList.get(i).getIcon());
holder.tvId.setText(arrayList.get(i).getId());
holder.tvSearchUrl.setText(arrayList.get(i).getUrl());
final String url = holder.tvSearchUrl.getText().toString();

SharedPreferences sp = context.getSharedPreferences("SavedSelected", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt("selected", selectedItem);
editor.apply();

sp = context.getSharedPreferences("SavedSelected", Context.MODE_PRIVATE);
int myIntValue = sp.getInt("selected", -1);
Log.d("Selected", "SharedPreferences" + myIntValue);

if (selectedItem == i) {
holder.tvIcon.setBackgroundColor(Color.parseColor("#30000000"));
Intent intent = new Intent("search_engines");
intent.putExtra("url", url);
intent.putExtra("selected", selectedItem);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
} else {
holder.tvIcon.setBackgroundColor(Color.parseColor("#00000000"));
}

holder.tvIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("search_engines");
intent.putExtra("url", url);
int PreviousSelectedItem = selectedItem;
selectedItem = i;
intent.putExtra("selected", selectedItem);
holder.tvIcon.setBackgroundColor(Color.parseColor("#30000000"));
notifyItemChanged(PreviousSelectedItem);
notifyDataSetChanged();
}
});
}

// ... Other necessary functions.
}

现在 MainActivity.class

RecyclerView paramRecyclerView;
SearchEngineAdapter sEngineAdapter;

paramRecyclerView = findViewById(R.id.lvEngines);
paramRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
paramRecyclerView.setHasFixedSize(true);
Intent intent = getIntent();
int intValue = intent.getIntExtra("selected", 0);
sEngineAdapter = new SearchEngineAdapter(context, arrayList, intValue);
paramRecyclerView.setAdapter(sEngineAdapter);

// Calling network APIs to populate the arrayList.

MainActivityonResume 函数如下所示。

protected void onResume() {
super.onResume();
searchPlugin.setText("");
getChangeColor();
}

这是在 MainActivity 中定义的点击处理程序,它将我发送到另一个 Activity。

btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newEntry = searchPlugin.getText().toString();
AddHistory(newEntry);
getFragmentRefreshListener().onRefresh();
Intent intent = new Intent(MainActivity.this, ActivitySearchEngine.class);
intent.putExtra("url", url );
intent.putExtra("name", newEntry);
intent.putExtra("selected", selectedItem2);
startActivity(intent);
}
});

另一个 Activity 是 ActivitySearchEngine.class

public class ActivitySearchEngine extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {

public String selectedName;
public int selectedID;
public String selectedSearchUrl;
RecyclerView mListView;
RecyclerView paramRecyclerView;
SearchEngineAdapter sEngineAdapter;

ArrayList<SearchEngine> arrayList = new ArrayList<>();
final Context context = this;
int selectedItem;

@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_result);

// Variables initialization

// Setting up adapter
paramRecyclerView.setAdapter(sEngineAdapter);
sEngineAdapter.notifyDataSetChanged();

// Calling network APIs to populate the arrayList here

Intent receivedIntent = getIntent();
selectedName = receivedIntent.getStringExtra("name");
selectedID = receivedIntent.getIntExtra("id", 1); //NOTE: -1 is just the default value
selectedSearchUrl = receivedIntent.getStringExtra("url");

// Loading the url in a WebView for searching
}
}

我可以在这两个 Activity 之间共享所选项目的位置。但是,我不确定如何实现在第二个 Activity 的 RecyclerView 中选择项目的行为。如果我在第二个 Activity 的 RecyclerView 中选择另一个项目,那么当我返回到第一个 Activity(即 MainActivity)时,更改也应该反射(reflect)出来。

如有任何帮助,我们将不胜感激。

最佳答案

这个问题有很多变化,因此下面这个答案的最后更新是最终版本。

就我对这个问题的理解而言,如果我理解正确的话,我可以看到你非常接近解决方案。 SearchEngineAdapter已经有一个 selectedItem其中的变量可用于突出显示在 ActivitySearchEngine 中选择的项目以及。您只需像下面这样稍微修改一下适配器。我在这里重写适配器。

public class SearchEngineAdapter extends RecyclerView.Adapter<SearchEngineAdapter.ViewHolder> {
private int selectedItem = 0;
private static RecyclerViewClickListener itemListener;

private Context context;
ArrayList<SearchEngine> arrayList = new ArrayList<>();

// Added another argument to be passed in the constructor
public SearchEngineAdapter(Context context, ArrayList<SearchEngine> arrayList, int selectedItem) {
this.context = context;
this.arrayList = arrayList;
this.selectedItem = selectedItem;
}

@NonNull
@Override
public SearchEngineAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.s_engine_item, viewGroup, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int i) {
if (selectedItem == i) {
holder.tvIcon.setBackgroundColor(Color.parseColor("#30000000"));
} else {
holder.tvIcon.setBackgroundColor(Color.parseColor("#00000000"));
}

holder.tvIcon.setImageResource(arrayList.get(i).getIcon());
holder.tvId.setText(arrayList.get(i).getId());
holder.tvSearchUrl.setText(arrayList.get(i).getUrl());

holder.tvIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int PreviousSelectedItem = selectedItem;
selectedItem = i;
holder.tvIcon.setBackgroundColor(Color.parseColor("#30000000"));
notifyItemChanged(PreviousSelectedItem);
notifyDataSetChanged();
}
});
}

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

public class ViewHolder extends RecyclerView.ViewHolder{
TextView tvId, tvSearchUrl;
ImageView tvIcon;
public ViewHolder(@NonNull View itemView) {
super(itemView);

tvId = itemView.findViewById(R.id.ivEngineText);
tvIcon = itemView.findViewById(R.id.ivEngine);
tvSearchUrl = itemView.findViewById(R.id.ivSearchUrl);
}
}
}

检查一下,我刚刚修改了你的适配器的构造函数,使用了另一个额外的变量 selectedItem .当您在两个 Activity 中初始化适配器时,只需传递所选项目的位置。在默认情况下,您可以传递 -1,我想您明白了。

您已将所选项目位置传递给 ActivitySearchEngine以及。可用于初始化所需行为。希望有帮助!

更新 1:

我建议您将以下代码添加到您的 onResume ActivitySearchEngine 中的函数类(class)。您可以考虑从 onCreate 中删除这些行您的代码的功能也是如此。

@Override
public void onResume() {
super.onResume();

Intent receivedIntent = getIntent();
selectedName = receivedIntent.getStringExtra("name");
selectedID = receivedIntent.getIntExtra("id", 1); // NOTE: -1 is just the default value
selectedSearchUrl = receivedIntent.getStringExtra("url");

sEngineAdapter = new SearchEngineAdapter(context, arrayList, selectedID);
paramRecyclerView.setAdapter(sEngineAdapter);
}

更新 2:

RecyclerView在你的MainActivity当您再次将适配器设置为 RecyclerView 时正在重新加载在onResume功能。此外,您正在尝试从此处不可用的 Intent 获取数据,我认为是因为您没有设置要发送到 MainActivity 的任何数据。当你从 ActivitySearchEngine 返回时.因此,RecyclerView正在重新加载一组新数据。

您可以删除与您的 RecyclerView 关联的代码来自 onResume MainActivity 的功能消除这种并发症,因为我认为这是没有必要的。所以更新了onResume功能将如下所示。

protected void onResume() {
super.onResume();
searchPlugin.setText("");
getChangeColor();
}

更新 3:

拍一个public static你的变量 MainAcitivity并将其声明为全局变量,如下所示。

// Setting 0 as you wanted to put the first item at the first time
// If you do not want that, then initialize with -1
public static int selectedItem = 0;

现在在你的 onCreate 里面函数,删除用于获取 intent 的行.

paramRecyclerView = findViewById(R.id.lvEngines);
paramRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
paramRecyclerView.setHasFixedSize(true);

// Remove the following
// Intent intent = getIntent();
// int intValue = intent.getIntExtra("selected", 0);

// Move the adapter setup to the onResume
// sEngineAdapter = new SearchEngineAdapter(context, arrayList, selectedItem);
// paramRecyclerView.setAdapter(sEngineAdapter);

// Calling network APIs to populate the arrayList.

修改onResume MainActivity 中的函数在那里设置适配器。

protected void onResume() {
super.onResume();
searchPlugin.setText("");
getChangeColor();

// Set the adapter here
sEngineAdapter = new SearchEngineAdapter(context, arrayList, selectedItem);
paramRecyclerView.setAdapter(sEngineAdapter);
}

修改onClickListener在您的适配器中,如下所示。只需在那里添加一个新行。

holder.tvIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("search_engines");
intent.putExtra("url", url);
int PreviousSelectedItem = selectedItem;
selectedItem = i;

// Set the static value in the MainActivity
// This can be accessed from all other classes
MainActivity.selectedItem = i;

intent.putExtra("selected", selectedItem);
holder.tvIcon.setBackgroundColor(Color.parseColor("#30000000"));
notifyItemChanged(PreviousSelectedItem);
notifyDataSetChanged();
}
});

希望对您有所帮助!

关于java - RecyclerView - 获取选定的位置并将该位置传递给另一个 Activity ,在该 Activity 中将显示与选定的特定项目相同的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54507274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com