OnItemClickListener.onItemClick() 失效

本文探讨了在使用GridViewItem进行应用开发时遇到点击事件失效的问题,通过将父布局的android:descendantFocusability属性设置为blocksDescendants,成功解决了事件传递被ImageButton阻碍的问题。

 今天在写一个GridView item的点击事件,用onItemClick来做,发现不生效,仔细一看,是发现我的itemview放了一个ImageButton,他阻碍了event的传递,解决方案在在父布局里加上

android:descendantFocusability="blocksDescendants"

 不让子元素获取点击事件,就ok了。


 

 

package com.weishitech.qichechangtingyinyue.fragment.Adapter; import android.widget.ImageView; import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.weishitech.qichechangtingyinyue.LCAppcation; import com.weishitech.qichechangtingyinyue.R; import com.weishitech.qichechangtingyinyue.bean.MusicBean; import com.weishitech.qichechangtingyinyue.utils.DisplayUtils; import com.weishitech.qichechangtingyinyue.utils.MusicPlayerManager; import java.util.List; public class PrivateAdapter extends BaseQuickAdapter<MusicBean.DataBean, BaseViewHolder> { private int currentPlayingPosition = -1; private boolean isPlaying = false; private List<MusicBean.DataBean> currentListSnapshot; public PrivateAdapter() { super(R.layout.private_adapter); } public void setList(List<MusicBean.DataBean> list) { super.setList(list); // 保存一份引用,供点击时使用 this.currentListSnapshot = list; } @Override protected void convert(@NonNull BaseViewHolder holder, MusicBean.DataBean dataBean) { holder.setText(R.id.tv_song_name, dataBean.getTitle()); holder.setText(R.id.tv_sing_name, dataBean.getSinger()); holder.setText(R.id.tv_tj, "之手 推荐-" + dataBean.getTitle()); ImageView coverView = holder.getView(R.id.iv_sing_logo); ImageView playBtn = holder.getView(R.id.iv_song_start); Glide.with(getContext()) .load(dataBean.getCover()) .error(R.mipmap.img_home_sing) .transform(new RoundedCorners(DisplayUtils.dp2px(getContext(), 8f))) .into(coverView); int position = getItemPosition(dataBean); // 设置按钮状态 if (position == currentPlayingPosition && isPlaying) { playBtn.setImageResource(R.mipmap.img_zt); // 显示暂停 } else { playBtn.setImageResource(R.mipmap.img_bf); // 显示播放 } //点击事件支持“播放/暂停”切换 + 上一首状态同步 playBtn.setOnClickListener(v -> { if (onItemClickListener != null) { onItemClickListener.onItemClick(position, dataBean); } MusicPlayerManager playerManager = MusicPlayerManager.getInstance(); boolean isPlaying = playerManager.isPlaying(); boolean isFromThisList = "private".equals(playerManager.getCurrentPlaylistTag()); int currentIdx = playerManager.getCurrentExternalIndex(); // 如果当前正在播放的就是这首 → 暂停 if (isPlaying && isFromThisList && currentIdx == position) { playerManager.pause(); // 更新本地状态 this.currentPlayingPosition = -1; this.isPlaying = false; notifyItemChanged(position); // 刷新当前项(变成播放图标) } else { // 否则:播放这首(无论之前哪首在播) playerManager.playFromExternalList( LCAppcation.getInstance(), currentListSnapshot, position, "private" ); playerManager.setPlayingFromPrivate(true); // 保存旧位置用于刷新 UI int oldPos = this.currentPlayingPosition; // 更新本地状态为新的播放项 this.currentPlayingPosition = position; this.isPlaying = true; // 刷新旧位置和新位置 notifyItemChanged(oldPos); // 旧项要变回“播放” notifyItemChanged(position); // 新项变成“暂停” } }); } // 外部调用:更新当前播放哪一首 public void updatePlayingPosition(int position, boolean isPlaying) { int oldPos = this.currentPlayingPosition; this.currentPlayingPosition = position; this.isPlaying = isPlaying; notifyItemChanged(oldPos); notifyItemChanged(position); } // 播放停止或退出时清空状态 public void clearPlayingState() { int oldPos = this.currentPlayingPosition; this.currentPlayingPosition = -1; this.isPlaying = false; notifyItemChanged(oldPos); } // 自定义接口 public interface OnItemClickListener { void onItemClick(int position, MusicBean.DataBean dataBean); } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener listener) { this.onItemClickListener = listener; } } 这个在当前歌曲上点击暂停歌曲暂停不了播放
12-05
package com.weishitech.jtwzjiaotongcx.fragment.lilv; import android.app.AlertDialog; import android.text.Html; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import android.widget.Toast; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.weishitech.jtwzjiaotongcx.R; import com.weishitech.jtwzjiaotongcx.adtakubase.activity.BaseBindActivity; import com.weishitech.jtwzjiaotongcx.bean.Question; import com.weishitech.jtwzjiaotongcx.databinding.ActivityDetailsBinding; import com.weishitech.jtwzjiaotongcx.fragment.Adapter.AnswerStatusAdapter; import com.weishitech.jtwzjiaotongcx.utils.OnMultiClickListener; import java.lang.reflect.Type; import java.util.List; public class AnswerDetailActivity extends BaseBindActivity<ActivityDetailsBinding> { private List<Question.DataBean> questionList; private RecyclerView recyclerView; private AnswerStatusAdapter adapter; @Override protected void init() { mBinding.ivBack.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { finish(); } }); recyclerView = mBinding.rv; recyclerView.setLayoutManager(new GridLayoutManager(this, 10)); // 每行10个题号 parseData(); setupAdapter(); } private void parseData() { String json = getIntent().getStringExtra("questionList"); Log.d("AnswerDetail", "Received JSON: " + json); if (json == null || json.isEmpty()) { Toast.makeText(this, "数据加载失败", Toast.LENGTH_SHORT).show(); finish(); return; } Type type = new TypeToken<List<Question.DataBean>>(){}.getType(); questionList = new Gson().fromJson(json, type); } private void setupAdapter() { adapter = new AnswerStatusAdapter(questionList, position -> { showQuestionDetailDialog(position); }); recyclerView.setAdapter(adapter); } private void showQuestionDetailDialog(int position) { Question.DataBean q = questionList.get(position); AlertDialog.Builder builder = new AlertDialog.Builder(this); View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_question_detail, null); builder.setView(dialogView); TextView tvTitle = dialogView.findViewById(R.id.tv_question_title); TextView tvUserAnswer = dialogView.findViewById(R.id.tv_user_answer); TextView tvCorrectAnswer = dialogView.findViewById(R.id.tv_correct_answer); TextView tvAnalysis = dialogView.findViewById(R.id.tv_analysis); TextView btnClose = dialogView.findViewById(R.id.btn_close); tvTitle.setText((position + 1) + ". " + q.getTitle()); String userAns = q.getShowAnswer(); if (!userAns.isEmpty()) { tvUserAnswer.setText(userAns); } else { tvUserAnswer.setText("未作答"); } tvCorrectAnswer.setText(q.getAnswer()); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { tvAnalysis.setText(Html.fromHtml(q.getAnalysis(), Html.FROM_HTML_MODE_LEGACY)); } else { tvAnalysis.setText(Html.fromHtml(q.getAnalysis())); } AlertDialog dialog = builder.create(); btnClose.setOnClickListener(v -> dialog.dismiss()); dialog.show(); } }package com.weishitech.jtwzjiaotongcx.bean; import com.hfd.common.model.PublicData; import java.util.List; // Question.java public class Question extends PublicData { private List<DataBean> data; public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * id : 147 * questionId : 30119 * title : 当事人有下列哪种行为,要承担交通事故全部责任? * rank : 1 * type : 1 * op1 : A、在高速公路上撞伤行人的 * op2 : B、在路口直行与转弯车辆刮碰的 * op3 : C、在快车道与摩托车刮碰的 * op4 : D、发生事故后故意损坏、伪造现场、毁灭证据的 * titleType : 1 * titlePic : * createTime : 2025-07-30 14:26:28 * updateTime : 2025-07-30 14:26:28 */ // { // "question": "在路口遇这种情形要减速让行。", // "answer": "1", // "item1": "正确", // "item2": "错误", // "item3": "", // "item4": "", // "explains": "当驾车在路口遇到图中减速让行标志时,机动车应主动减速让行。\r<br/><p><img src=http://tp.mnks.cn/tp_177.jpg>\r<br/>减速让行\r<br/><img src=http://tp.mnks.cn/tp_176.jpg>\r<br/>停车让行\r<br/></p>", // "url": "https://aimgs.oss-cn-shenzhen.aliyuncs.com/jztk/2017/c1c2subject1/4750.jpg" // }, private int id; private int questionId; private String title; private int rank; private int type; private String op1; private String op2; private String op3; private String op4; private int titleType; private String titlePic; private String createTime; private String updateTime; private boolean isSelectA;//选中 private boolean isSelectB; private boolean isSelectC; private boolean isSelectD; private String showAnswer = "";//确认答案 private String answer; private String analysis; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getQuestionId() { return questionId; } public void setQuestionId(int questionId) { this.questionId = questionId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getOp1() { return op1; } public void setOp1(String op1) { this.op1 = op1; } public String getOp2() { return op2; } public void setOp2(String op2) { this.op2 = op2; } public String getOp3() { return op3; } public void setOp3(String op3) { this.op3 = op3; } public String getOp4() { return op4; } public void setOp4(String op4) { this.op4 = op4; } public int getTitleType() { return titleType; } public void setTitleType(int titleType) { this.titleType = titleType; } public String getTitlePic() { return titlePic; } public void setTitlePic(String titlePic) { this.titlePic = titlePic; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getUpdateTime() { return updateTime; } public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } public boolean isSelectA() { return isSelectA; } public void setSelectA(boolean selectA) { isSelectA = selectA; } public boolean isSelectB() { return isSelectB; } public void setSelectB(boolean selectB) { isSelectB = selectB; } public boolean isSelectC() { return isSelectC; } public void setSelectC(boolean selectC) { isSelectC = selectC; } public boolean isSelectD() { return isSelectD; } public void setSelectD(boolean selectD) { isSelectD = selectD; } public String getShowAnswer() { return showAnswer; } public void setShowAnswer(String showAnswer) { this.showAnswer = showAnswer; } public String getAnswer() { return answer; } public void setAnswer(String answer) { this.answer = answer; } public String getAnalysis() { return analysis; } public void setAnalysis(String analysis) { this.analysis = analysis; } } } package com.weishitech.jtwzjiaotongcx.fragment.Adapter; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.weishitech.jtwzjiaotongcx.R; import com.weishitech.jtwzjiaotongcx.bean.Question; import java.util.List; public class AnswerStatusAdapter extends RecyclerView.Adapter<AnswerStatusAdapter.ViewHolder> { private final List<Question.DataBean> questions; private final OnItemClickListener listener; public interface OnItemClickListener { void onItemClick(int position); } public AnswerStatusAdapter(List<Question.DataBean> questions, OnItemClickListener listener) { this.questions = questions; this.listener = listener; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { Button button = new Button(parent.getContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 0, // width: 权重分配 180, 1.0f ); params.setMargins(8, 8, 8, 8); button.setLayoutParams(params); button.setTextSize(14); button.setAllCaps(false); // 关闭大写转换 return new ViewHolder(button); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Button button = holder.button; Question.DataBean data = questions.get(position); String userAnswer = data.getShowAnswer(); button.setText(String.valueOf(position + 1)); if (userAnswer.isEmpty()) { // 未答:白底黑框 button.setBackgroundColor(Color.WHITE); button.setTextColor(Color.BLACK); button.setBackgroundResource(R.drawable.bg_answer_unanswered); } else if (userAnswer.equals(data.getAnswer())) { // 正确:蓝底白字圆角 button.setBackgroundResource(R.drawable.bg_answer_correct); button.setTextColor(Color.WHITE); } else { // 错误:红底白字圆角 button.setBackgroundResource(R.drawable.bg_answer_wrong); button.setTextColor(Color.WHITE); } button.setOnClickListener(v -> listener.onItemClick(position)); } @Override public int getItemCount() { return questions.size(); } static class ViewHolder extends RecyclerView.ViewHolder { Button button; public ViewHolder(Button button) { super(button); this.button = button; } } } 没有显示数据
最新发布
12-31
<?xml version="1.0" encoding="utf-8"?> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical"> <View android:id="@+id/view" android:layout_width="0dp" android:layout_height="0dp" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:itemCount="1" tools:listitem="@layout/item_home_new_tab" /> </LinearLayout> package com.weishitechsub.PCwuhengliulanqi.ui.home.fragment import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.listener.OnItemClickListener import com.gyf.immersionbar.ImmersionBar import com.weishitechsub.PCwuhengliulanqi.base.fragment.BaseBindFragment import com.weishitechsub.PCwuhengliulanqi.base.util.handler.HandlerUtil import com.weishitechsub.PCwuhengliulanqi.databinding.FragmentHomeNewBinding import com.weishitechsub.PCwuhengliulanqi.ui.home.adapter.HomeNewTabAdapter import com.weishitechsub.PCwuhengliulanqi.ui.home.adapter.HomeNewViewPagerAdapter import com.weishitechsub.PCwuhengliulanqi.ui.home.bean.HomeNewTabBean class HomeNewFragment : BaseBindFragment(), OnItemClickListener { private var mAdapter: HomeNewTabAdapter? = null private var mTabFragmentList: List<HomeNewTabBean>? = null init { mTabFragmentList = getData() } override fun init() { ImmersionBar.with(this) .titleBar(mBinding.view) .keyboardEnable(true) .statusBarDarkFont(false) .init() var manager = LinearLayoutManager(mContext) manager.orientation = RecyclerView.HORIZONTAL mBinding.recycler.layoutManager = manager mAdapter = HomeNewTabAdapter() mBinding.recycler.adapter = mAdapter mAdapter!!.setList(mTabFragmentList) mAdapter!!.setOnItemClickListener(this) mBinding.viewPager.setUserInputEnabled(false) val adapter = HomeNewViewPagerAdapter(childFragmentManager, lifecycle, mTabFragmentList) mBinding.viewPager.setAdapter(adapter) mBinding.viewPager.offscreenPageLimit = mTabFragmentList!!.size HandlerUtil.postDelayed { initPosition(0) } } private fun getData(): List<HomeNewTabBean> { var mTabList = ArrayList<HomeNewTabBean>() // mTabList.add(HomeNewTabBean(“追剧”, RankListFragment())) // mTabList.add(HomeNewTabBean(“短视频”, VideoFragment())) // mTabList.add(HomeNewTabBean(“剧场”, DramaTheaterFragment())) mTabList.add(HomeNewTabBean("推荐", MyDramaDrawFragment())) mTabList.add(HomeNewTabBean("排行榜", RankListFragment())) mTabList.add(HomeNewTabBean("新剧", NewDramaFragment())) mTabList.add(HomeNewTabBean("经典好剧", DramaCustomFragment())) mTabList.add(HomeNewTabBean("已完结", NewDramaFragment())) return mTabList } override fun onItemClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) { if (mAdapter!!.setCheck(position)) { mBinding.viewPager.setCurrentItem(position, false) } initPosition(position) } private fun initPosition(position: Int) { var fragment = mTabFragmentList!![position]!!.fragment when (fragment) { is VideoFragment -> { // fragment.initVideo() } } } }我的意思就是推荐的话设置充满<androidx.viewpager2.widget.ViewPager2 android:id=“@+id/view_pager” android:layout_width=“match_parent” android:layout_height=“match_parent” />,不是推荐的话ViewPager2在布局LinearLayout下面显示,这种样式
12-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值