В вопросе было много изменений, и поэтому последнее обновление этого ответа ниже является окончательной версией.
Насколько я мог понять о проблеме, я вижу, что вы очень близки к решению, если я правильно понял.В 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
.Просто передайте позицию выбранного элемента при инициализации адаптера в обоих действиях.В случае по умолчанию вы можете передать -1, я думаю, вы поняли идею.
Вы также передали позицию выбранного элемента на ActivitySearchEngine
.Который можно использовать для инициализации желаемого поведения.Надеюсь, это поможет!
Обновление 1:
Я хотел бы предложить вам добавить следующий код в вашу функцию onResume
в классе ActivitySearchEngine
.Вы также можете удалить строки из функции 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
функция.Более того, вы пытаетесь получить данные из намерения, которого здесь нет, я думаю, потому что вы не установили никаких данных для отправки на 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();
}
});
Надеюсь, это поможет!