2016-01-20 5 views
0

Мне нужен пользовательский relativeLayout, потому что я буду использовать его много раз в другом списке. И в каком бы списке это не было, прослушиватель кликов пользовательского relativeLayout является тем же намерением, что и для запуска одного действия. Поэтому я пишу слушателю в этом классе, а не getView() в адаптере. Я хочу добавить клик-прослушиватель в custom relativeLayout и добавить пользовательский relativeLayout в качестве элемента в listview, но когда я нажимаю элемент, слушатель не работает. Что мне делать? Пожалуйста помоги.Как добавить прослушиватель кликов в пользовательский 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

попробуйте добавить слушателя к вашему преобразованию внутри метода 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; 
} 

EDIT: Альтернативный вариант, вы можете установить onClickListener в конструкторе. Все еще не нужно переопределять setOnClickListener.

public SearchCourseItem(Context context) { 
    super(context); 
    init(context); 
    super.setOnClickListener(...); 
} 
+0

Я буду использовать пользовательский relativeLayout много раз, а в другом списке и другом адаптере, поэтому я хочу написать код в пользовательском 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(). Но даже если теоретически это было сделано правильно, не работал, пока я не удалил атрибут android:clickable="true" из моего корневого макета list_item.xml.

Смежные вопросы