После создания своего адаптера, и применения его к 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
DocsAdapter(Context context, ArrayList
@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
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
@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);
}
}
Комментариев нет:
Отправить комментарий