2012-11-04 2 views
3

У меня есть Android GridView с ImageView, TextView и двумя Button's. Сетка выглядит прекрасно, но мне сложно обрабатывать события кнопок в пределах GridView. Я новичок в Android.Android GridView Button Click Handler

Любая помощь будет оценена по достоинству.

Спасибо.

+0

вы получите ответы гораздо лучшего качества, если вы разместите свой код, чтобы сопровождать это. – mango

ответ

0

Вы должны использовать onItemClickListener

gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, 
       long row) { 
} 

Позиция должна рассказать вам о элемент щелкнул. Но я думаю, что gridview имеет проблемы с обработкой объектов с помощью кликов-кликов (например, кнопок). Может быть, лучше изменить gridview для другого контейнера. Если вам нужен gridview, вы можете использовать setOnTouchListener для позиции catch на экране и создать руководство onitemclicklistener.

10

Если вы хотите, чтобы кнопки (и что-нибудь еще), чтобы иметь уникальные действия щелкните в макете, вам нужно написать специальный адаптер и переопределить getView():

public MyAdapter(Context context, List<T> objects) { 
    ... 
    inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if(convertView == null) { 
     // Inflate and initialize your layout 
     convertView = inflater.inflate(R.layout.grid_item, parent, false); 
     holder = new ViewHolder(); 
     holder.btnOne = (Button) convertView.findViewById(R.id.btnOne); 
     holder.btnOne.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Do something 
      } 
     }); 
     // etc, etc... 
     convertView.setTag(holder); 
    } 
    else 
     holder = (ViewHolder) convertView.getTag(); 

    // Do things that change for every grid item here, like 
    holder.textOne.setText(getItem(position));   
    return convertView; 
} 


class ViewHolder { 
    Button btnOne; 
    TextView textOne; 
} 

Эта концепция была объяснена достаточно хорошо в различных Google Talks за эти годы, here is one.


Добавление

Я пытаюсь установить текст TextView внутри колонки GridView при нажатии на кнопку внутри GridView.

Вы должны быть в состоянии получить доступ к любому виду в макете в onClick() методе, прося родительским View, а затем получать ViewHolder:

public void onClick(View v) { 
    ViewHolder holder = (ViewHolder) ((View) v.getParent()).getTag(); 
    // Do something with holder.textOne now 
} 

(Это предполагает, что макет не имеет никакого вложенные ViewGroups, поэтому настроить соответствующим образом.)

+0

Спасибо за ваш ответ. Я пытаюсь установить текст TextView внутри столбца GridView, щелкнув по кнопке внутри GridView. Я не могу получить ссылку на TextView. Я добавляю код getView моего адаптера. – user1404963

+0

Я добавил пример, чтобы ссылаться на любой другой макет в ViewHolder от дочернего. Позвольте мне знать, если это помогает. – Sam

+0

Спасибо Сэм.Это действительно помогло! Событие OnItemClick моего GridView не срабатывает. Это из-за кнопок внутри GridView? – user1404963

3

Либо установка OnClick слушателя внутри адаптера и слушать тот же щелчок, как описано в following blog

внутри адаптера

holder.okay_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((GridView)parent).performItemClick(v,position,0); 

     } 
    }); 
holder.cancel_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((GridView)parent).performItemClick(v,position,0); 

     } 
    }); 

В файле Java.

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int  position, long id) { 
      switch(view.getId) 
     { 
     case R.id.okay_button: 
      //do your stuff 
      break; 
     case R.id.cancel_button: 
      //do your stuff 
      break; 
      } 
    }); 

Примечания: если вы используете более одного дочерний элемент нажми слушатель, используйте переключатель случай, чтобы проверить, какой элемент щелкнул внутри SetOnItemClickListener.Because Использования если еще вызывает весь щелчок слушатель вы имеете в адаптере. если какое-нибудь хорошее решение для этого, дайте мне знать. Благодарю.

+1

Это отличная помощь! Спасибо, что блог, с которым вы связались, потрясающий. – Fattie