2016-01-20 72 views
0

我需要一个自定义的relativeLayout,因为我将在不同的列表视图中多次使用它。无论哪种列表视图,自定义的relativeLayout的点击监听器的意图都是启动一个活动。所以我在这个类中编写了点击监听器,而不是在适配器中使用getView()。 我想添加点击侦听器到自定义的relativeLayout,并且将自定义的relativeLayout作为一个项目添加到列表视图中,但是当我单击该项目时,侦听器不起作用。 我该怎么办?请帮忙。如何添加点击监听器到自定义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; 
    } 
+0

试图通过添加监听到你的convertView getView方法内部 – DadoZolic

+0

要调用它,并通过一个倾听者的首要'setOnClickListener'代替。我想这就是为什么没有触发点击。 – AlbAtNf

+0

您能否描述为什么您需要自定义RelativeLayout? – hardartcore

回答

1

不要覆盖

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(...); 
} 
+0

我会多次使用自定义的relativeLayout,并且在不同的listview和不同的适配器中,所以我想在自定义的relativeLayout中编写代码。 – zhangkaiyue

+0

您也可以在布局的构造函数中设置侦听器。查看我的编辑。 – AlbAtNf

+0

谢谢你! – zhangkaiyue

1
Try onclick listener to your convertView 

Code: 

yourview.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       //Do something 
      } 
     }); 

return yourview; 
1

我做的东西,看起来像你做什么,但在RecyclerView.Adapter,与我的自定义视图的构造充气list_item.xml到每个新的实例。然后在我的适配器中,我使用onBindViewHolder()方法附加了我的听众。但是,即使在理论上它似乎做了正确的方式,它没有工作,直到我从list_item.xml的根布局删除android:clickable="true"属性。

相关问题