OnClickListener для Recycler View ничего не возвращает - PullRequest
0 голосов
/ 01 июля 2019

Я новичок и пытаюсь создать простое приложение для записи голоса.Я уже разместил на сайте информацию о доступе к внешнему хранилищу.Эта проблема теперь решена, но у меня есть еще одна, касающаяся моего RecyclerView.

Я следовал онлайн-уроку, чтобы определить, по какому виду щелкнули, и воспроизвести звук соответствующим образом (я использую свой RecyclerView для отображения всех только что созданных файлов записи).Вот учебник, о котором идет речь: https://www.youtube.com/watch?v=ZXoGG2XTjzU

Проблема в том, что OnNoteClick абсолютно ничего не делает.Как я могу это исправить?

Я создал интерфейс с прикрепленной к нему функцией 'OnNoteClick'.Я реализовал эту функцию в mainactivity.java.По сути, я следовал за учебником.

\\\ Adapter Code
private OnNoteListener mOnNoteListener;

...

public RecyclerViewAdapter(@NonNull ArrayList<String> text, Context context, OnNoteListener onNoteListener) {
        Text = text;
        this.context = context;
        this.mOnNoteListener = onNoteListener;
    }
...
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
        ViewHolder holder = new ViewHolder(view, mOnNoteListener);
        return holder;
    }
...
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView textView;
        CardView ParentLayout;
        OnNoteListener onNoteListener;
        public ViewHolder(@NonNull View itemView, OnNoteListener onNoteListener) {
            super(itemView);
            textView = itemView.findViewById(R.id.cardtext);
            ParentLayout = itemView.findViewById(R.id.cardview);
            this.onNoteListener = onNoteListener;
            ParentLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onNoteListener.onNoteClick(getAdapterPosition());
        }
    }
    public interface OnNoteListener{
        void onNoteClick(int position);
    }

}
...
\\\ MainActivityCode
public class FileAndDirectoryActivity extends AppCompatActivity implements RecyclerViewAdapter.OnNoteListener {
...
private void initRecyclerView() {
        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, this, this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
...
    @Override
    public void onNoteClick(int position) {
        Toast.makeText(this, "Good News : I'm working", Toast.LENGTH_SHORT).show();
    }
}
...

Я ожидаю, что приложение покажет сообщение с надписью "Я работаю" или что-то в этом роде, но на самом деле, когда я касаюсь карты, ничего не происходит.

Ответы [ 4 ]

0 голосов
/ 01 июля 2019

Ваша проблема в:

public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
    holder.textView.setText(Text.get(i));
    holder.ParentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: Click on this card !");
        }
    });
}

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

public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
    holder.textView.setText(Text.get(i));
}
0 голосов
/ 01 июля 2019

Здесь я дал вам четкое объяснение,

Создание одного общего Interface с именем CustomItemClickListenere

public interface CustomItemClickListenere {
    public void onItemClick(View v, int position); }

Измените класс адаптера, как показано ниже,

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private ArrayList<AddSingleItemList> data;

    private Context mContext;
    private CustomItemClickListenere listener;

    public RecyclerViewAdapter(Context mContext, ArrayList<AddSingleItemList> data, CustomItemClickListenere listener) {
        this.data = data;
        this.mContext = mContext;
        this.listener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_list_single_item, parent, false);
        final ViewHolder mViewHolder = new ViewHolder(mView);
        mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(v, mViewHolder.getPosition());
            }
        });
        return mViewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.itemTitle.setText(Html.fromHtml(data.get(position).getTitle()));
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView itemTitle;
        public CardView cardView;

        ViewHolder(View v) {
            super(v);
            itemTitle = (TextView) v.findViewById(R.id.person_name);
            cardView = (CardView) v.findViewById(R.id.cv);
        }
    }
}

адаптер xml item_list_single_item :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/cv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <TextView
            android:id="@+id/person_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:textSize="12sp" />

    </RelativeLayout>

</android.support.v7.widget.CardView>

Здесь я создал класс Pojo для установки статических элементов на Recyclerview, названный AddSingleItemList :

public class AddSingleItemList {
    private String title;
    long id;

    /**
     *
     * @param id
     * @param title
     */
    public AddSingleItemList(long id, String title) {
        this.id = id;
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

Обновление RecyclerViewActivity как показано ниже:

public class RecyclerViewActivity extends AppCompatActivity {
    RecyclerView itemsList;
    RecyclerViewAdapter adapter;
    ArrayList<AddSingleItemList> data = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        itemsList = (RecyclerView) findViewById(R.id.items_list);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        itemsList.setLayoutManager(llm);
        itemsList.setHasFixedSize(true);

        //Add you items into the Recyclerview list
        data.add(new AddSingleItemList(1, "First Item"));
        data.add(new AddSingleItemList(2, "Second Item"));

        adapter = new RecyclerViewAdapter(this, data, new CustomItemClickListenere() {
            @Override
            public void onItemClick(View v, int position) {
                Log.d("RecyclerViewActivity", "clicked position:" + position);
                Toast.makeText(RecyclerViewActivity.this, "Good News : I'm working", Toast.LENGTH_SHORT).show();
                // do what ever you want to do with it
            }
        });
        itemsList.setAdapter(adapter);
    }
}

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

Screenshot

0 голосов
/ 01 июля 2019

Просто создайте setonclicklistener вид в методе onBind.И вызовите interface метод для этого.

Как

mOnNoteListener.onNoteClick(pos);

pos целое число, поскольку позиция получена в onBind метод

0 голосов
/ 01 июля 2019

Измените свой адаптер на приведенный ниже код, а также убедитесь, что вы получаете правильные id из cardView

private OnNoteListener mOnNoteListener;

...

public RecyclerViewAdapter(@NonNull ArrayList<String> text, Context context, OnNoteListener onNoteListener) {
        Text = text;
        this.context = context;
        this.mOnNoteListener = onNoteListener;
    }
...
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.cardview, viewGroup, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
...
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView textView;
        CardView ParentLayout;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.cardtext);
            ParentLayout = itemView.findViewById(R.id.cardview);
            ParentLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            mOnNoteListener.onNoteClick(getAdapterPosition());
        }
    }
    public interface OnNoteListener{
        void onNoteClick(int position);
    }

}

Нет необходимости передавать слушатель в конструкторе ViewHolder, потому что у вас есть mOnNoteListener как глобальная переменная.

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