81個のボタンがあるGridViewがあります。このグリッドビューにクリックリスナーを追加したいのですが、利用できません。 OnItemClickListenerを追加しましたが、機能していません。理由を理解できません。コードにエラーはありません。動作しない唯一のものは、OnItemClickListenerです。
ボタンが付いているgridviewの子(gridview_members.xml);
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
>
<Button
Android:id="@+id/city"
Android:layout_width="183dp"
Android:layout_height="90dp"
Android:textSize="19sp"
Android:textStyle="bold"
Android:text="Code\n\nCity"
Android:gravity="center"
Android:background="@drawable/city_btn_tablet" />
</RelativeLayout>
私のImageAdapterクラス。
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return 81;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
gridView =new View(mContext);
gridView = inflater.inflate(R.layout.gridview_members, null);
Button city = (Button) gridView.findViewById(R.id.city);
return gridView;
}
}
Activity_main.xmlでのGridviewの実装。
<GridView
Android:id="@+id/gridview"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:horizontalSpacing="5dp"
Android:verticalSpacing="5dp"
Android:gravity="center"
Android:stretchMode="columnWidth"
Android:numColumns="6" >
</GridView>
そして最後に、私のMainActivity.Javaファイル。
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
}
}
アイテム(アイテム内のボタンではなく)のクリックをリクエストしているため、子XMLレイアウトを変更する必要があります
から
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
>
<Button
Android:id="@+id/city"
Android:layout_width="183dp"
Android:layout_height="90dp"
Android:textSize="19sp"
Android:textStyle="bold"
Android:text="Code\n\nCity"
Android:gravity="center"
Android:background="@drawable/city_btn_tablet" />
</RelativeLayout>
に
<?xml version="1.0" encoding="utf-8"?>
<Button
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/city"
Android:layout_width="183dp"
Android:layout_height="90dp"
Android:textSize="19sp"
Android:clickable="true"
Android:textStyle="bold"
Android:text="Code\n\nCity"
Android:gravity="center"
Android:background="@drawable/city_btn_tablet" />
または、アダプタ内にClickListenerを追加できます
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
gridView =new View(mContext);
gridView = inflater.inflate(R.layout.gridview_members, null);
Button city = (Button) gridView.findViewById(R.id.city);
city.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast here
}});
return gridView;
}
GridViewはクリック可能で、GridView内にボタンを配置する必要はありません。
グリッドにリスナーを追加するには、次のコードを追加します。
// Implement On Item click listener
gridView1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
break;
case 1:
break;
}
}
});
など、ケースにすべての番号を追加できます。
アイテムをクリックしたテキストを取得したい場合は、これを使用できます
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String item = ((TextView)view.findViewById(R.id.ID_OF_TEXTVIEW)).getText().toString();
Toast.makeText(showMissions.this, "" + item, Toast.LENGTH_SHORT).show();
}
});
アクティビティクラスに追加するのではなく、getviewメソッドにクリックリスナーを追加することをお勧めします。このコードを試してください
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
gridView =new View(mContext);
gridView = inflater.inflate(R.layout.gridview_members, null);
Button city = (Button) gridView.findViewById(R.id.city);
city.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//Do your task here
}
});
return gridView;
}
この方法で、Kotlinのグリッドビューアイテムにクリックリスナーを追加できます。
grdlyt_merchant_color_code.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
loyaltyColor = parent.getItemAtPosition(position) as LoyaltyColor?
colorCode= LoyaltyUtils.getLoyaltyColorById(loyaltyColor!!.colorId).colorCode
val color = ContextCompat.getColor(requireContext(), colorCode!!)
shape.setColor(color)
loyalty_card_img.background = shape
uncheckAllColors()
loyalty_card_img.visibility = View.GONE
loyaltyColor!!.isColorSelected = true
mAdapter.notifyDataSetChanged()
}
CustomAdapterに
onBindViewHolder(...
{
yourViewHolder.gridview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Do Something
}
});
}