OnItemClickListener срабатывает для нескольких элементов listview, в чем подвох?

Доброго времени суток. В процессе разработки столкнулись с проблемой: при формировании списка ListView и установки OnItemClickListener на них, последний срабатывает при однократном нажатии одновременно для нескольких элементов этого списка, при чем для разных ListView - по разному. Где-то для каждого четвертого, где-то для каждого пятого и т.п. Пробовали дебажить позиции и айди элементов - результат получали верный. Подскажите, в чем, собственно, заключается проблема? Код прилагаю.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shop_info_activity);

Intent intent = getIntent();
jsonObj = intent.getStringExtra("jsonObj");

buttonCall = (Button) findViewById(R.id.buttonCall);
buttonSite = (Button) findViewById(R.id.buttonSite);
buttonMap = (Button) findViewById(R.id.buttonMap);
list = (ListView) findViewById(R.id.list);

mainLayout = (LinearLayout) findViewById(R.id.mainLayout);
HomeActivity.cust.applyTypeface(mainLayout, HomeActivity.cust.getTypeface(this));

try {
shops = new JSONObject(jsonObj);
posterImage = (SmartImageView) findViewById(R.id.posterImage);
posterImage.setImageUrl(POSTER_FOLDER+shops.getString(TAG_POSTER_FULL));
shopTitle = (TextView) findViewById(R.id.shopTitle);
shopTitle.setText(shops.getString(TAG_TITLE));
shopDesc = (TextView) findViewById(R.id.shopDesc);
shopDesc.setText(shops.getString(TAG_DESC_FULL));

shopArray = shops.getJSONArray(TAG_DICOUNTS);

for(int i = 0; i < shopArray.length(); i++) {
String name_disc = shopArray.getJSONObject(i).getString(TAG_NAME_DISC);
String desc_disc = shopArray.getJSONObject(i).getString(TAG_DESC_DISC);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_NAME_DISC, name_disc);
map.put(TAG_DESC_DISC, desc_disc);
oslist.add(map);

}

BaseAdapter adapter = new MySimpleAdapter(this, oslist,
R.layout.shop_disc_item,
new String[] {TAG_NAME_DISC, TAG_DESC_DISC}, new int[] {
R.id.discName, R.id.discInfo});
list.setAdapter(adapter);
list.setOnItemClickListener(this);

} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
discInfo = (TextView) view.findViewById(R.id.discInfo);
arrow = (ImageView) view.findViewById(R.id.arrow);
nameLayout = (LinearLayout) view.findViewById(R.id.nameLayout);

switch (discInfo.getVisibility()){
case View.GONE:
discInfo.setVisibility(View.VISIBLE);
nameLayout.setBackgroundColor(getResources().getColor(R.color.strangeGreen));
break;
case View.VISIBLE:
discInfo.setVisibility(View.GONE);
nameLayout.setBackgroundColor(getResources().getColor(R.color.buttonGreen));
break;
}
}
class MySimpleAdapter extends SimpleAdapter {

public MySimpleAdapter(Context context,
List<? extends Map<String, ?» data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
}

@Override
public void setViewText(TextView v, String text) {
Typeface face = Typeface.createFromAsset(getAssets(), "fonts/PLUMCRG.ttf");
v.setTypeface(face);
v.setText(text);
}
}
  • Вопрос задан
  • 2682 просмотра
Решения вопроса 1
aratj
@aratj
программер.
1. он не срабатывает для нескольких элементов.
2. нужно понимать, что у списков есть recycle
3. используйте кастомные адаптеры со своими моделями.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы