2013-11-21 56 views
2

我已經創建了一個顯示字母表的字母的gridview。我使用自定義BaseAdapter向字符串數組填充gridview。Android - GridView與自定義BaseAdapter,得到點擊查看在位置

我想要做的是能夠在GridView中的某個位置獲取Button視圖。

例如,我希望能夠從我的gridView.setOnItemClickListener();獲得設置被點擊的按鈕的BackgroundColor。

到目前爲止,我只能得到文本形式的字符串數組在一個位置,但我不知道如何獲得點擊按鈕。

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" 
    tools:ignore="MergeRootFrame" > 

    <GridView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myGridView" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:numColumns="7" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Large Text" 
     android:id="@+id/feedback" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 
</RelativeLayout> 

cell.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <Button 
     android:id="@+id/grid_item" 
     android:layout_gravity="center" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="05" 
     android:textSize="20sp" 
     android:clickable="false" 
     android:focusable="false"/> 
    </Button> 

</LinearLayout> 

MainActivity

public class MainActivity extends Activity { 

    private TextView text; 
    private GridView gridView; 
    private final String[] items = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
      "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     text = (TextView) findViewById(R.id.feedback); 

     gridView = (GridView) this.findViewById(R.id.myGridView); 
     CustomGridAdapter gridAdapter = new CustomGridAdapter(MainActivity.this, items); 
     gridView.setAdapter(gridAdapter); 
     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       text.setText((String) (gridView.getItemAtPosition(position))); 
       Log.i("ITEM_CLICKED", "" + (String) (gridView.getItemAtPosition(position))); 
      } 
     }); 

    } 
} 

CustomGridAdapter

public class CustomGridAdapter extends BaseAdapter { 

    private Context context; 
    private String[] items; 
    LayoutInflater inflater; 

    public CustomGridAdapter(Context context, String[] items) { 
     this.context = context; 
     this.items = items; 
     inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.cell, null); 
     } 
     Button button = (Button) convertView.findViewById(R.id.grid_item); 
     button.setText(items[position]); 

     return convertView; 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return items[position]; 
    } 

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

這裏是如何看起來

enter image description here

回答

5

我想通了我自己。我只是改變了我的cell.xml到:

<Button xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/grid_item" 
     android:layout_gravity="center" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="05" 
     android:textSize="20sp" 
     android:clickable="false" 
     android:focusable="false"/> 
    </Button> 

然後我可以這樣得到任何按鈕:

Button button = (Button) gridView.getChildAt(position); 
+0

感謝,這有助於! – mitchellt

1

1)如果你只需要改變背景顏色或其他水木清華 - 你最好使用選擇。

2)在你的例子中,你不需要膨脹XML文件,然後找到按鈕,你可以動態地創建一個按鈕,然後直接返回這個按鈕。 3)如果你必須膨脹複雜的視圖 - 在你onItemClickListener你可以通過適配器\ gridview.getItem獲得你的視圖,然後,當你收到你的視圖時,可以執行findViewById並找到所有必要的視圖。

0

在onItemClick()

gridAdapter.itemSelected = position; 
在CustomGridAdapter

public int itemSelected = -1; 

getView(..) 

    TextView tv = (TextView) convertView.findViewById(R.id.feedback); 
    if (itemSelected == position) {    
     tv.setBackgroundColor(int selectedcolor); 
    } else { 
     tv.setBackgroundColor(int unselectcolor); 
    } 
相關問題