如何将点击监听器添加到自定义 relativeLayout
How to add click listener to custom relativeLayout
我需要一个自定义的相对布局,因为我会在不同的列表视图中多次使用它。并且无论是哪个列表视图,自定义 relativeLayout 的点击侦听器与启动一个 activity 的意图相同。所以我在这个 class 中写点击监听器,而不是在适配器中写 getView() 。
我想将点击侦听器添加到自定义 relativeLayout,并将自定义 relativeLayout 作为项目添加到列表视图,但是当我单击该项目时,侦听器不起作用。
我应该怎么办?请帮忙
自定义相对布局:
public class SearchCourseItem extends RelativeLayout {
@Bind(R.id.iv_search_course)
ImageView mIvSearchCourse;
@Bind(R.id.tv_search_course_title)
TextView mTvSearchCourseTitle;
@Bind(R.id.tv_search_course_detail)
TextView mTvSearchCourseDetail;
private SearchCourseEntity.DataEntity datas;
public SearchCourseItem(Context context) {
super(context);
init(context);
}
public void init(Context context) {
setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
LayoutInflater.from(context).inflate(R.layout.item_search_course, this);
ButterKnife.bind(this);
}
public void setData(SearchCourseEntity.DataEntity datas) {
this.datas = datas;
mTvSearchCourseDetail.setText(datas.getDescription());
mTvSearchCourseTitle.setText(datas.getName());
ImageLoader.getInstance().displayImage(datas.getPicture(), mIvSearchCourse, UILHelper.getMediumPlaceHolderBaseBuilder().build());
}
@Override
public void setOnClickListener(OnClickListener l) {
Intent intent = new Intent();
if (datas.getType().equals("workout")) {
intent.setClass(getContext(), DailyTrainActivity.class);
intent.putExtra("workoutid", datas.getId());
} else {
intent.setClass(getContext(), PlanActivity.class);
intent.putExtra("planid", datas.getId());
}
getContext().startActivity(intent);
}
}
适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SearchCourseItem searchCourseItem;
if (convertView != null && convertView instanceof SearchCourseItem) {
searchCourseItem = (SearchCourseItem) convertView;
} else {
searchCourseItem = new SearchCourseItem(mContext);
}
searchCourseItem.setData(mDataEntities.get(position));
return searchCourseItem;
}
Try onclick listener to your convertView
Code:
yourview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Do something
}
});
return yourview;
不要覆盖
public void setOnClickListener(OnClickListener l)
将代码移至 onClickListener 并将其设置在您的 getView() 中。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SearchCourseItem searchCourseItem;
if (convertView != null && convertView instanceof SearchCourseItem) {
searchCourseItem = (SearchCourseItem) convertView;
} else {
searchCourseItem = new SearchCourseItem(mContext);
}
searchCourseItem.setData(mDataEntities.get(position));
searchCourseItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
if (searchCourseItem.getData().getType().equals("workout")) { //Don't know, if that is what you want!!!
intent.setClass(getContext(), DailyTrainActivity.class);
intent.putExtra("workoutid", datas.getId());
} else {
intent.setClass(getContext(), PlanActivity.class);
intent.putExtra("planid", datas.getId());
}
getContext().startActivity(intent);
}
});
return searchCourseItem;
}
编辑:您可以在构造函数中设置一个 onClickListener。仍然不需要重写 setOnClickListener。
public SearchCourseItem(Context context) {
super(context);
init(context);
super.setOnClickListener(...);
}
我正在做一些看起来像你所做的事情,但是在 RecyclerView.Adapter
中,我的自定义视图的构造函数将 list_item.xml
膨胀到每个新实例中。然后在我的适配器中,我在 onBindViewHolder()
方法中附加了我的监听器。但即使在理论上它似乎是正确的方式,直到我从我的 list_item.xml
的根布局 中删除 android:clickable="true"
属性,它才起作用.
我需要一个自定义的相对布局,因为我会在不同的列表视图中多次使用它。并且无论是哪个列表视图,自定义 relativeLayout 的点击侦听器与启动一个 activity 的意图相同。所以我在这个 class 中写点击监听器,而不是在适配器中写 getView() 。 我想将点击侦听器添加到自定义 relativeLayout,并将自定义 relativeLayout 作为项目添加到列表视图,但是当我单击该项目时,侦听器不起作用。 我应该怎么办?请帮忙
自定义相对布局:
public class SearchCourseItem extends RelativeLayout {
@Bind(R.id.iv_search_course)
ImageView mIvSearchCourse;
@Bind(R.id.tv_search_course_title)
TextView mTvSearchCourseTitle;
@Bind(R.id.tv_search_course_detail)
TextView mTvSearchCourseDetail;
private SearchCourseEntity.DataEntity datas;
public SearchCourseItem(Context context) {
super(context);
init(context);
}
public void init(Context context) {
setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
LayoutInflater.from(context).inflate(R.layout.item_search_course, this);
ButterKnife.bind(this);
}
public void setData(SearchCourseEntity.DataEntity datas) {
this.datas = datas;
mTvSearchCourseDetail.setText(datas.getDescription());
mTvSearchCourseTitle.setText(datas.getName());
ImageLoader.getInstance().displayImage(datas.getPicture(), mIvSearchCourse, UILHelper.getMediumPlaceHolderBaseBuilder().build());
}
@Override
public void setOnClickListener(OnClickListener l) {
Intent intent = new Intent();
if (datas.getType().equals("workout")) {
intent.setClass(getContext(), DailyTrainActivity.class);
intent.putExtra("workoutid", datas.getId());
} else {
intent.setClass(getContext(), PlanActivity.class);
intent.putExtra("planid", datas.getId());
}
getContext().startActivity(intent);
}
}
适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SearchCourseItem searchCourseItem;
if (convertView != null && convertView instanceof SearchCourseItem) {
searchCourseItem = (SearchCourseItem) convertView;
} else {
searchCourseItem = new SearchCourseItem(mContext);
}
searchCourseItem.setData(mDataEntities.get(position));
return searchCourseItem;
}
Try onclick listener to your convertView
Code:
yourview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Do something
}
});
return yourview;
不要覆盖
public void setOnClickListener(OnClickListener l)
将代码移至 onClickListener 并将其设置在您的 getView() 中。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SearchCourseItem searchCourseItem;
if (convertView != null && convertView instanceof SearchCourseItem) {
searchCourseItem = (SearchCourseItem) convertView;
} else {
searchCourseItem = new SearchCourseItem(mContext);
}
searchCourseItem.setData(mDataEntities.get(position));
searchCourseItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
if (searchCourseItem.getData().getType().equals("workout")) { //Don't know, if that is what you want!!!
intent.setClass(getContext(), DailyTrainActivity.class);
intent.putExtra("workoutid", datas.getId());
} else {
intent.setClass(getContext(), PlanActivity.class);
intent.putExtra("planid", datas.getId());
}
getContext().startActivity(intent);
}
});
return searchCourseItem;
}
编辑:您可以在构造函数中设置一个 onClickListener。仍然不需要重写 setOnClickListener。
public SearchCourseItem(Context context) {
super(context);
init(context);
super.setOnClickListener(...);
}
我正在做一些看起来像你所做的事情,但是在 RecyclerView.Adapter
中,我的自定义视图的构造函数将 list_item.xml
膨胀到每个新实例中。然后在我的适配器中,我在 onBindViewHolder()
方法中附加了我的监听器。但即使在理论上它似乎是正确的方式,直到我从我的 list_item.xml
的根布局 中删除 android:clickable="true"
属性,它才起作用.