#java #android #android-gridview
#java — язык #Android #android-gridview #java
Вопрос:
У меня есть GridView
с пользовательским View
в нем, который является Button
и TextView
. Я определил setOnItemClickListener
, но, похоже, он никогда не вызывался, пожалуйста, смотрите фрагменты кода ниже.
gridview = (GridView) findViewById(R.id.main_gridview);
gridview.setAdapter(new GridAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), "gadsfadsf",
Toast.LENGTH_SHORT).show();
Log.d("Main", "onItemClick");
}
});
Ответ №1:
Отмеченный ответ является своего рода взломом. Вместо установки onclicklistener для кнопки просто убедитесь, что ButtonView и TextView имеют следующее свойство:
android:clickable="false"
Комментарии:
1. это было решение. Спасибо
2. а также android:focusable=»false»
3. простой и наилучший ответ.
Ответ №2:
У меня была такая же проблема. Хотя я еще не понял, почему он никогда не вызывается, я могу предложить обходной путь.
Вместо того, чтобы устанавливать OnClickListener в вашем GridView, установите его на самой кнопке внутри вашего GridAdapter, внутри вашего метода getView().
У меня это сработало!
Комментарии:
1. Да, это сработало, но почему не работает touch on grid view, эта проблема не связана с listview, почему grid view
Ответ №3:
Возможно, некоторые элементы в вашем GridView отвлекают внимание. Попробуйте добавить эти атрибуты к любым элементам, которые у вас есть внутри сетки:
android:focusable="false"
android:focusableInTouchMode="false"
Ответ №4:
Вместо того, чтобы устанавливать onClickListener
на вашем GridView
,
установите его на Button
себе внутри вашего GridAdapter
, внутри вашего getView()
метода.
У меня это сработало!
Ответ №5:
У меня была та же проблема, событие grid.itemClickListener
так и не было запущено.
В моем случае у меня было два слушателя: grid.itemClickListener
и еще один clickListener
, прикрепленный к Button
в макете элемента.
Повозившись некоторое время с макетом, я понял, что если в макете элемента был виджет с focusable=true
, то itemClickListener
он никогда не запускался. clickListener
Прикрепленный к Button
, тем не менее, работал хорошо.
Возможно, это был ваш случай. В любом случае, я думаю, что эта информация может быть полезна другим пользователям, столкнувшимся с той же проблемой.
Ответ №6:
Спасибо CodingUser
то, что мы делали, — это прямой доступ к макету внутри GridView, поэтому OnItemClickListener считает, что доступ к элементу сбивает с толку.
Итак, решение состоит в том, чтобы применить OnClickListener внутри адаптера (т. Е. обычно ArrayAdapter)
итак, что я пытаюсь сказать, это:
public View getView(int position, View convertView, ViewGroup parent) {
//Here row is a view and we can set OnClickListener on this
final View row;
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
//Here we inflate the layout to view (linear in my case)
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.imageTitle = (TextView) row.findViewById(R.id.text);
holder.image = (ImageView) row.findViewById(R.id.image);
row.setTag(holder);
} else {
row = convertView;
holder = (ViewHolder) row.getTag();
}
ImageItem item = data.get(position);
holder.imageTitle.setText(item.getTitle());
holder.image.setImageBitmap(item.getImage());
//Now get the id or whatever needed
row.setId(position);
// Now set the onClickListener
row.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, "Clicked" row.getId() "!!",
Toast.LENGTH_SHORT).show();
}
});
return row;
}
Ответ №7:
Вы можете установить OnClick для просмотра в адаптере GridView .У меня это работает.
public View getView(final int position, View convertView, ViewGroup parent) {
ObjMenuVideo objListVideo = mListMenuVideo.get(position);
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_video_of_kind, null);
holder.tv_number_views = (TextView) convertView
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_number_views.setText(String.valueOf(objListVideo.getViews()));
convertView.setId(position);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent menuVideoIntent = new Intent(mContext,
ActivityDetailVideo.class);
mContext.startActivity(menuVideoIntent);
}
});
return convertView;
}