Несколько просмотров с кликами внутри элемента списка

Я пытаюсь создать элемент в ListView, который имеет несколько опций; просматривать и редактировать. Я хотел бы создать его точно так же, как и контактная система Android - см. Ниже:

Я добавил красные поля, чтобы проиллюстрировать поведение, которое я хочу. Если вы нажмете в левом красном поле, вы вызываете контакт. Если вы нажмете в правом красном поле, вы отправите текстовое сообщение контакту. Я уже создал аналогичный макет в XML, но мне не удается реализовать эту функциональность в коде.

Я попытался создать пользовательский андроид: вызовы функции onClick для отдельных макетов внутри элемента, но вызов метода onClick позволяет только передавать в виде как параметр, а не позицию. Чтобы использовать функцию listview.getItemAtPosition, я попытался использовать listview.getPositionForView, чтобы вернуть позицию, но обнаружил, что это было крайне нестабильно и было очень легко вернуть неправильное позиционирование из-за повторной обработки представлений.

Затем я попытался установить позицию позиции как "тег" в методе getView моего адаптера, например: convertView.setTag(position). Но в методе onClick моей активности я пытаюсь использовать getTag и отбрасывать его обратно в целое число, и он всегда возвращает null, что вызывает недоумение.

Каков наилучший способ реализации списка, заполненного элементами с несколькими кнопками/макетами для каждого элемента?

3 ответа

Вы можете создать событие onClick для каждого вида в своей строке следующим образом:

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">
 <textview android:id="@+id/text_id" android:layout_width="0sp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:onclick="textOnClickEvent">
 </textview></linearlayout>

Или даже, добавьте onClick-слушателей на каждое представление в методе getView...

подробнее об этом здесь.


В представлении списка, когда вы определяете метод getview, здесь вы указываете все детали одного элемента списка. Там вы можете указать onlick событие каждого из просмотров.


в классе адаптера, добавьте View.OnClickListener к методу getView:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
 if(view == null) {
 final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
 view = layoutInflater.inflate(R.layout.grid_vendor_item, null);
 }
 final TextView textName = (TextView) view.findViewById(R.id.text_id);
 final ImageButton imageProfil = (TextView) view.findViewById(R.id.button_id);
 textName.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 // add your edit codes
 }
 });
 imageProfil.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 // add your open prodil codes
 }
 }); 
 return view;
}

licensed under cc by-sa 3.0 with attribution.