GridView点击事件异常及获取courseId字段问题求助
解决GridView点击失效与courseId获取问题
嗨,我来帮你搞定这两个头疼的问题!咱们一步步来:
一、先解决GridView OnItemClickListener没反应的问题
GridView的item点击没响应,十有八九是你item布局里的子控件(比如TextView、ImageView)抢了焦点,导致点击事件被拦截了。给你两个简单的解决办法:
- 给根布局加属性(推荐)
在courses_row_layout.xml的根RelativeLayout里加上这个属性:
android:descendantFocusability="blocksDescendants"
这个属性会直接禁止所有子控件获取焦点,确保GridView的item能接收到点击事件。
- 给子控件单独设置
如果不想全局禁用子控件焦点,也可以给布局里的TextView、ImageView这些控件加上:
android:focusable="false" android:focusableInTouchMode="false"
这样它们就不会抢占item的点击事件了。
二、正确获取courseId的两种方式
方式一:直接从数据源拿(最靠谱)
其实完全不用费劲从View里找TextView的内容,直接通过Adapter拿到对应位置的Courses对象,就能直接取到id,还能避免View复用带来的问题:
修改MainActivity里的点击事件代码:
coursesGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 获取点击位置对应的Courses对象 Courses clickedCourse = (Courses) parent.getItemAtPosition(position); Intent signUp = new Intent(MainActivity.this, Signup.class); signUp.putExtra("course_id", String.valueOf(clickedCourse.getId())); startActivity(signUp); Log.e("CLICKED", "YES"); } });
方式二:通过View的Tag获取(如果非要从View里取)
如果你还是想从View里获取courseId,那得先把你Adapter里的CourseHolder类补全(现在它是空的),然后利用Tag来拿:
首先修改CoursesAdapter里的CourseHolder:
static class CourseHolder { TextView courseId; TextView courseName; TextView courseStartDate; TextView courseEndDate; }
然后修改点击事件代码:
coursesGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CoursesAdapter.CourseHolder holder = (CoursesAdapter.CourseHolder) view.getTag(); String courseId = holder.courseId.getText().toString(); Intent signUp = new Intent(MainActivity.this, Signup.class); signUp.putExtra("course_id", courseId); startActivity(signUp); Log.e("CLICKED", "YES"); } });
三、额外的小优化:让Adapter更规范
你的CoursesAdapter可以用泛型来优化,不要用原始的ArrayAdapter,改成ArrayAdapter<Courses>,这样就不用每次强转对象了,代码更安全易读:
public class CoursesAdapter extends ArrayAdapter<Courses> { List<Courses> courses = new ArrayList<>(); public CoursesAdapter(@NonNull Context context, int resource) { super(context, resource); } @Override public void add(Courses object) { courses.add(object); } @Override public int getCount() { return courses.size(); } @Nullable @Override public Courses getItem(int position) { return courses.get(position); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View row; row = convertView; CourseHolder courseHolder; if(row == null) { LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); row = layoutInflater.inflate(R.layout.courses_row_layout, parent, false); courseHolder = new CourseHolder(); courseHolder.courseId = row.findViewById(R.id.courseId); courseHolder.courseName = row.findViewById(R.id.courseName); courseHolder.courseStartDate = row.findViewById(R.id.courseStartDate); courseHolder.courseEndDate = row.findViewById(R.id.courseEndDate); row.setTag(courseHolder); } else { courseHolder = (CourseHolder) row.getTag(); } // 这里不用强转了 Courses courses = getItem(position); courseHolder.courseId.setText(String.valueOf(courses.getId())); courseHolder.courseName.setText(courses.getName()); courseHolder.courseName.setLines(3); courseHolder.courseStartDate.setText(courses.getStartDate()); courseHolder.courseEndDate.setText(courses.getEndDate()); return row; } }
内容的提问来源于stack exchange,提问作者George Dobre
相关产品推荐
相关产品推荐

