2017-07-09 1 views
0

Ich versuche ein GridView zu erstellen, das einige Schaltflächen enthält. Die Schaltflächen werden gefüllt, aber OnItemClickListener() wird nicht aufgerufen, wenn auf eine Schaltfläche in der GridView geklickt wird.OnItemClickListener wird nicht auf Button in GridView aufgerufen

Tierbew Klassencode

gridView = (GridView) findViewById(R.id.gridview); 
    gridView.setAdapter(new ButtonAdapter(getApplicationContext(),answer)); 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      flipper.showNext(); 

     } 
    }); 

Benutzerdefinierte Schaltfläche Adapter

public class ButtonAdapter extends BaseAdapter{ 

private Context context; 
private int[] numbers = new int[100]; 
private String[] answer; 

public ButtonAdapter (Context context,String[] answer){ 
    this.context = context; 
    this.answer = answer; 
    for(int i=0;i<100;i++){ 
     numbers[i] = i+1; 
    } 
} 

@Override 
public int getCount() { 
    return numbers.length; 
} 

@Override 
public Object getItem(int i) { 
    return null; 
} 

@Override 
public long getItemId(int i) { 
    return 0; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 

    View gridView; 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view == null) { 
     gridView = new View(context); 
     gridView = inflater.inflate(R.layout.adapter, null); 

    } else { 
     gridView = (View) view; 
    } 

    Button button = (Button) gridView.findViewById(R.id.adapter_button); 
    button.setText(numbers[i]+""); 

    if(answer[i].equals("null")) 
     button.setBackgroundColor(context.getResources().getColor(R.color.reset)); 
    else 
     button.setBackgroundColor(context.getResources().getColor(R.color.optionCheck)); 

    return gridView; 
} 
} 

adapter.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:id="@+id/adapter_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 
</LinearLayout> 

acitvity_layout.xml

<GridView 
     android:id="@+id/gridview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:numColumns="5" 
     android:columnWidth="50dp" 
     android:stretchMode="columnWidth" 
     android:layout_below="@+id/back" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
+0

Sie hängen an den setOnItemClickListener von gridView, das sollten die Buttons 'setOnItemClickListener' sein? – JeffUK

+1

Ich folge den Android-Dokumenten (https://developer.android.com/guide/topics/ui/layout/gridview.html). Hier wird setOnItemClickListener auf die Gridview und nicht auf das darin enthaltene Element gesetzt. –

+0

@JeffUK Seine Schaltflächen liegen innerhalb der Gridview, die er von adapter.xml auffüllt. Ich bin skeptisch gegenüber seiner getView-Implementierung, bei der er eine neue Ansicht erstellt und zurückgibt. Warum nicht dieselbe Ansicht zurückgeben, die er in Argumenten weitergegeben hat! –

Antwort

0

Sie benötigen eine Schnittstelle zu implementieren und haben Ihre Aktivität auf die speziellen Tastendrücke über die Schnittstelle Hörer abonnieren. Ihr ButtonAdapter sollte den onClickListener implementieren, aber Ihre Aktivität sollte die Schnittstelle mit Ihren benutzerdefinierten Methoden implementieren. Die Aktivität und der Adapter sind zwei verschiedene Welten mit zwei verschiedenen Bereichen. Gehe langsam durch diesen Beitrag und folge seiner Logik. Es sollte Sie in die richtige Richtung setzen: How to create interface between Fragment and adapter?

Die Art, wie ein Adapter mit einem Fragment arbeitet, ist praktisch das gleiche wie bei einer Aktivität.

+0

ok, das könnte ein Weg sein, es zu tun. Derzeit suche ich, was mit dem Code, den ich hier habe, nicht stimmt. –

+0

Nun, für den Anfang setzen Sie einen onClickListener für die GridView ... nicht die Schaltfläche. Darüber hinaus können Sie ohne Verwendung einer Schnittstelle keine UI-Interaktionen für die Aktivität registrieren. Ich würde empfehlen, dass Sie eine Schnittstelle verwenden. – mrfilter

+0

Ja, das war die Sache, die ich falsch gemacht habe. Ich habe OnClickListener auf die Schaltfläche innerhalb des Adapters gesetzt und es hat angefangen zu arbeiten. –

Verwandte Themen