Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Создание контекстного меню на нажатие объекта в ListView с кастомным адаптером

После создания своего адаптера, и применения его к ListView перестал работать клик на элемент и перестало открываться контекстное меню элемента при долгом тапе.
package com.vkdocs;
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView;
import java.util.ArrayList;
public class DocsAdapter extends BaseAdapter implements AdapterView.OnItemClickListener { Context ctx; LayoutInflater lInflayter; ArrayList objects;
DocsAdapter(Context context, ArrayList docs) { ctx = context; objects = docs; lInflayter = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }
@Override public int getCount() { return objects.size(); }
@Override public Object getItem(int position) { return objects.get(position); }
@Override public long getItemId(int position) { return position; }
@Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if(view == null) { view = lInflayter.inflate(R.layout.item, parent, false); }
DocsElement d = getDoc(position);
((TextView) view.findViewById(R.id.tvName)).setText(d.name);
CheckBox checkDoc = (CheckBox) view.findViewById(R.id.cbBox);
checkDoc.setOnCheckedChangeListener(myChangeListener); checkDoc.setTag(position); checkDoc.setChecked(d.box);
return view; }
DocsElement getDoc(int position) { return ((DocsElement)getItem(position)); }
ArrayList getBox() { ArrayList box = new ArrayList(); for(DocsElement d : objects) { if(d.box) box.add(d); } return box; }
CompoundButton.OnCheckedChangeListener myChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { getDoc((Integer) buttonView.getTag()).box = isChecked; } };
@Override public void onItemClick(AdapterView parent, View view, int position, long id) {
} }
Layout для отображения списка


Ответ

Повесьте слушатель в getView адаптера:
view.setOnLongClickListener(...); Анимация риппл эфекта для кастомной разметки сама собой не включится. Можно подключить её сторонней библиотекой
UPD_0:
В адаптере создайте интерфейс, передайте его в него через конструктор и вызовете в момент долгого нажатия:
public class DocsAdapter extends BaseAdapter implements { public interface MyOnLongClick { public void onClick(View v, int position); }
... MyOnLongClick interface;
DocsAdapter(Context context, ArrayList docs, MyOnLongClick interface) { ... this.interface = interface; }
@Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; if(view == null) { view = lInflayter.inflate(R.layout.item, parent, false); } view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.d("TAG", "onLongClick in adapter"); interface.onClick(v, position); return false; } }); ... } }
В актвити реализуйте этот интерфейс и передайте ссылку на него в адаптер при его создании:
public class ActivityMain extends AppCompatActivity implements DocsAdapter.MyOnLongClick { ... @Override onClick(View v, int position) { Log.d("Tag", "onClick method from intercace called in activity class for position: "+position); }
@Override public void onCreate(Bundle b) { ... DocsAdapter adapter = new DocsAdapter(context, docs, this); } }

Комментариев нет:

Отправить комментарий