回收者视图的OnClickListener不返回任何内容

时间:2019-07-01 10:10:26

标签: java android android-recyclerview

我是一个初学者,我正在尝试构建一个简单的语音记录器应用程序。我已经在网站上发布了有关外部存储访问的信息。现在已经解决了这个问题,但是我还有另一个与我的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();
    }
}
...

我希望该应用程序显示一条消息,显示“我正在工作”或类似内容,但实际上,当我触摸Cardview时,什么也没发生。

4 个答案:

答案 0 :(得分:0)

将您的适配器更改为以下代码,并确保您正确获取了{strong> cardView

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

}

因为您有mOnNoteListener作为全局变量,所以不需要在ViewHolder构造函数上传递侦听器。

答案 1 :(得分:0)

在这里我给你清楚的解释,

创建一个通用的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

答案 2 :(得分:0)

只需使用setonclicklistener方法创建视图的onBind。然后调用interface方法。

喜欢

mOnNoteListener.onNoteClick(pos);

pos整数作为onBind方法中的位置

答案 3 :(得分:0)

您的问题出在

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上设置了一个新的Click侦听器,因此它将覆盖您在构造函数中设置的Click侦听器。不尝试它,它应该可以工作:

public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
    holder.textView.setText(Text.get(i));
}