TextView の上に ImageView を含む RelativeLayout によって構成された要素のグリッドを表示しようとしています。
私はすでに他の誰かが同じ質問をしているのを見たことがあり、提案された解決策をすでに採用していました。とにかく、このソリューションでは、getView()
関数は TextView ではなく、ImageView 項目のみを返します。RelativeLayout を拡張するカスタム アイテムを返そうとしましたが、Gridview に要素が表示されません。それらをクリックすると、トースト メッセージが表示されますが (以下のリスナー コードを参照)、Gridview の (灰色の) 背景だけが画面に表示されます。
上記のソリューションで提案されているように、ImageView または TextView のみを渡すと、単一のアイテムが表示されます。したがって、私の問題は、getView を管理してカスタム ビュー内の 2 つの項目を返す方法です。
これまでの私のコードは次のとおりです。
活動クラス:
List<String> mItemsImage;
List<String> mItemsText;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
mItemsImage = new ArrayList<String>();
mItemsText = new ArrayList<String>();
mGridView = (GridView) findViewById(R.id.mygridview);
fillArraylists();
mGridView.setAdapter(new CustomItemAdapter(this, mItemsImage, mItemsText));
mGridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(MyActivity.this, "text is + "mItemsText.get(position), Toast.LENGTH_SHORT).show();
}
});
}
アダプタ クラス:
class CustomItemAdapter extends BaseAdapter{
private Context mContext;
private List<String> mImageList;
private List<String> mTextList;
public CustomItemAdapter(Context c, List<String> imageList, List<String> textList) {
mContext = c;
mImageList = imageList;
mTextList = textList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CustomItem item;
if (convertView == null) { // if it's not recycled, initialize some attributes
item = new CustomItem(mContext, mImageList.get(position), mTextList.get(position));
item.findViewById(R.id.grid_item);//Tried to add this line in a second moment, but it didn't work anyway
item.setLayoutParams(new GridView.LayoutParams(parent.getWidth() >> 2, parent.getHeight() >> 2));
} else {
item = (CustomItem) convertView;
}
return item;
//if I do 'return item.image' or 'return item.text' I can see the View on screen normally
}
}
CustomItem クラス:
class CustomItem extends RelativeLayout{
public ImageView image;
public TextView text;
public CustomItem(Context ctx, String imagepath, String description){
super(ctx);
image = new ImageView(ctx);
image.findViewById(R.id.grid_item_image);
image.setScaleType(ImageView.ScaleType.CENTER_CROP);
image.setPadding(8, 8, 8, 8);
image.setImageBitmap(BitmapFactory.decodeFile(imagepath));
text = new TextView(ctx);
text.findViewById(R.id.grid_item_text);
text.setPadding(8, 0, 8, 0);
text.setText(description);
}
}
mylayout.xml:
...
<GridView
android:id="@+id/mygridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background_lightgrey_rect"
android:gravity="center"
android:numColumns="2"
android:stretchMode="columnWidth" >
</GridView>
grid_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/grid_item" >
<ImageView
android:id="@+id/grid_item_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/default_image"
android:contentDescription="@string/image_not_found" />
<TextView
android:id="@+id/grid_item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/grid_item_image"
android:layout_centerHorizontal="true"
android:text="@string/image_not_found"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>