RecyclerView - получить выбранную позицию и передать позицию другой деятельности, где появится тот же список с выбранным конкретным элементом - PullRequest
0 голосов
/ 03 февраля 2019

Я объявил ViewModel.class для RecyclerView адаптер, и я проанализировал MainActivity и другой Activity, поэтому у меня есть один и тот же адаптер для обеих операций.

Я могу показатьпроанализировал данные в обеих операциях, но проблема в том, что я не могу взять данные выбранного элемента в MainActivity, а затем установить для этого btnSearch для щелчка, чтобы затем я мог разделить между действиями данные из выбранного элемента.

Каждый раз, когда приложение открыто, выбирается первый элемент.То, что я пытаюсь достичь, это.

  1. Получите позицию элемента в MainActivity, поэтому, когда я нажму на кнопку, поиск данных выбранного элемента будет intent.putExtra, а затем получит данные в другом действии.
  2. Если я щелкну по второму предмету и перейду к другому занятию, будет выбран тот же предмет.

Вот то, что я пробовал до сих пор.

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.

Функция onResume MainActivity выглядит следующим образом.

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

Это обработчик кликов, определенный в MainActivity, который отправляет меня в другое действие.

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

И другое действие, которое 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
    }
}

Я мог бы разделить позицию выбранного элемента между этими двумя действиями.Однако я не уверен, как добиться того, чтобы поведение предмета выбиралось и в RecyclerView второго упражнения.Если я выберу другой элемент в RecyclerView второго упражнения, это изменение должно быть отражено и в первом (то есть MainActivity), когда я вернусь к нему.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 04 февраля 2019

В вопросе было много изменений, и поэтому последнее обновление этого ответа ниже является окончательной версией.

Насколько я мог понять о проблеме, я вижу, что вы очень близки к решению, если я правильно понял.В 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();
    }
});

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...