2013-11-21 3 views
2

Я создал сетку, которая отображает буквы алфавита. Я заполняю gridview массив строк, используя пользовательский BaseAdapter.Android - Gridview с пользовательским базовым адаптером, щелкните по нему. Вид в позиции

Что я хочу сделать, так это иметь возможность получить Button Посмотреть в позиции в GridView.

Например, я хочу, чтобы иметь возможность использовать мой 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); 
    } 
Смежные вопросы