Как мы можем установить onClickListener для каждого элемента списка (каждой строки) представления переработчика, различные действия для различных объектов списка - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно установить OnClickListener для каждого элемента списка recycler view.
Я хочу перейти к другому виду деятельности, щелкая каждый элемент списка.

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

Предположим, Я хочу щелкнуть строку с текстом «dd», затем она должна перейти к операции с именем «abc»

пожалуйста, помогите мне. пожалуйста. * * 1013

Это основная деятельность:

public class MainActivity extends AppCompatActivity implements WordAdapter.OnNoteListener {
    private RecyclerView recyclerView;
    private static final String TAG = MainActivity.class.getCanonicalName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.home_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(layoutManager);

        List<Word> wordList = new ArrayList<>();


        wordList.add(new Word(R.drawable.ic_launcher_background, "dd"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "ss"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "cc"));


        WordAdapter adapter = new WordAdapter(this);
        recyclerView.setAdapter(adapter);
        adapter.addItems(wordList);
    }

    @Override
    public void onNoteClick(int position) {
        Log.d(TAG, "clicked on the position:" + position);
Intent intent = new Intent(this, abc.class);
        this.startActivity(intent);
    }
}

Это адаптер, названный WordAdapter:

public class WordAdapter extends RecyclerView.Adapter<WordAdapter.ViewHolder> {

    private List<Word> wordList;
    private OnNoteListener mOnNoteListener;

    public WordAdapter(List<Word> wordList, OnNoteListener onNoteListener) {
        this.wordList = wordList;
        this.mOnNoteListener = onNoteListener;
    }

    public WordAdapter(OnNoteListener onNoteListener) {
        this(new ArrayList<Word>(), onNoteListener);
    }

    public void addItems(List<Word> items) {
        wordList.addAll(items);
        notifyDataSetChanged();
    }

    public void clear() {
        wordList.clear();
        notifyDataSetChanged();
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewholder, int position) {
        int resource = wordList.get(position).getImageResource();
        String title = wordList.get(position).getTitle();
        viewholder.setData(resource, title);
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private ImageView imageView;
        private TextView title;

        private OnNoteListener onNoteListener;

        public ViewHolder(@NonNull View itemView, OnNoteListener onNoteListener) {
            super(itemView);

            imageView = itemView.findViewById(R.id.imageView);
            title = itemView.findViewById(R.id.word);
            this.onNoteListener = onNoteListener;

            itemView.setOnClickListener(this);
        }

        private void setData(int resource, String titleText) {
            imageView.setImageResource(resource);
            title.setText(titleText);
        }

        @Override
        public void onClick(View view) {
            onNoteListener.onNoteClick(getAdapterPosition());
        }
    }

    public interface OnNoteListener {
        void onNoteClick(int position);
    }
}

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Ваш Adapter класс будет иметь ваш interface, как показано ниже:

public class AdapterClass extends RecyclerView.Adapter<AdapterClass.Viewholder>{

private OnItemClick onItemClick;

public NotificationAdapter(Context context) {
       onItemClick = (OnItemClick)context;
    }

public interface OnItemClick {
        void onClick(int position);
    }

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {

holder.layout.setOnClickListener(v -> {
            onItemClick.onClick(position);
        });

    }
}

Теперь ваш Activity будет реализовывать этот интерфейс , как показано ниже:

         public class MainActivity extends AppCompatActivity implements AdapterClass.OnItemClick {


                @Override
                public void onClick(int position) {
                    Log.d(TAG, "clicked on the position:" + position);
                    startNewActivity(position);
                }

                private void startNewActivity(int position){
                Intent intent = new Intent(MainActivity.this, NewActivity.class);
                //Pass your data here if required
                intent.putExtra("key_for_data", position); 

                startActivity(intent);
        }
    }
0 голосов
/ 20 июня 2019

Итак, я приложу полное решение, так как я немного изменил исходный код.

public class WordAdapter extends RecyclerView.Adapter<WordAdapter.ViewHolder> {


    private List<Word> wordList;
    private OnNoteListener mOnNoteListener;

    public WordAdapter(List<Word> wordList, OnNoteListener onNoteListener) {
        this.wordList = wordList;
        this.mOnNoteListener = onNoteListener;
    }

    public WordAdapter(OnNoteListener onNoteListener) {
        this(new ArrayList<Word>(), onNoteListener);
    }

    public void addItems(List<Word> items) {
        wordList.addAll(items);
        notifyDataSetChanged();
    }

    public void clear() {
        wordList.clear();
        notifyDataSetChanged();
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewholder, int position) {
        int resource = wordList.get(position).getImageResource();
        String title = wordList.get(position).getTitle();
        viewholder.bind(resource, title, mOnNoteListener);
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView imageView;
        private TextView title;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.imageView);
            title = itemView.findViewById(R.id.word);
        }

        private void bind(final int resource, final String titleText, final OnNoteListener listener) {
            imageView.setImageResource(resource);
            title.setText(titleText);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onNoteClick(titleText);
                }
            });
        }
    }

    public interface OnNoteListener {
        void onNoteClick(String dataClicked);
    }
}


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

    public class MainActivity extends AppCompatActivity implements WordAdapter.OnNoteListener {

    private RecyclerView recyclerView;

    private static final String TAG = MainActivity.class.getCanonicalName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.home_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(layoutManager);

        List<Word> wordList = new ArrayList<>();


        wordList.add(new Word(R.drawable.ic_launcher_background, "dd"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "ss"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "cc"));


        WordAdapter adapter = new WordAdapter(this);
        recyclerView.setAdapter(adapter);
        adapter.addItems(wordList);
    }

    @Override
    public void onNoteClick(String dataClicked) {
        Log.d(TAG, "clicked on the position:" + dataClicked);
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putExtra(STRING_EXTRA, dataClicked);
        startActivity(intent);
    }
}


Для второго упражнения я добавил кое-что простое.

    public class SecondActivity extends AppCompatActivity {


    public static final String TAG = SecondActivity.class.getSimpleName();

    public static String STRING_EXTRA = "string_extra";

    private TextView textView = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        textView = findViewById(R.id.tv_received);
        parseIntent(getIntent());
    }

    private void parseIntent(Intent intent) {
        if (intent != null) {
            Bundle extras = intent.getExtras();
            assert extras != null;
            String received = extras.getString(STRING_EXTRA);
            textView.setText(received);
        }

    }
}


Я добавил базовый макет xml (second_activity.xml):

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/tv_received"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="received from activity one"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>


Теперь вам нужно зарегистрировать действие в манифесте.и ты должен быть готов.

   <aplication tag here>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>

        <activity android:name=".SecondActivity" />
0 голосов
/ 20 июня 2019

Обновите ваш интерфейс, добавив в качестве параметра ViewHolder.

public interface OnNoteListener {
    public void onNoteClick(ViewHolder viewHolder);    // Don't need position anymore, since you can call viewHolder.getAdapterPosition() directly.
}

Чтобы завершить процедуру, ознакомьтесь с @ sm_happy, предоставленной ссылка .

А затем в onNoteClick() изменении метода вашей Деятельности Текст

viewHolder.textView.setText(viewHolder.textView.getText().toString() + "dd");    // Although the better option would be to instead keep a parameterized string in your resources file.

и запускают новую активность .

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