前提・実現したいこと
ソースコードのような2つのクラスのフィールドを別々のデータベースに保存します。
その後呼び出すときには2つのクラスは同じItemという括りでまとめて、図のようにidの昇順(同じ場合はAが先)にソートして、名前だけをリスト表示し、それぞれのクリックイベントを持たせたいです。
// 9/4 17:15 下部に詳細を追記しました。
発生している問題
図のように同名のインスタンスが出てきた際にそれらを識別する手段がないです。
また、同名でなくてもItemAなのでItemBなのかでもクリックイベントの挙動を変えるため、それも区別しなければならないです。
インスタンス化したものをAdapterに渡すのも手なのですが、Viewには名前しか表示されないにも関わらずインスタンス生成のコスト(今は話を簡略化するためにフィールドを3つにしていますが、実際に動くのは他クラスのインスタンスを含む15以上のもの)をかけるのはもったいないです。
###解決案
何らかの形でViewに文字列を保持させることができれば正規表現による条件分岐でクリックイベントを変えられます。
例えばItemAのidが1のインスタンス情報なら、文字列をa1とおけばそれで識別できます。
###知りたいこと
Viewにidなどの形で文字列を設定できる方法があればそれを、また上記のようなことを実現できるスマートな手段があればご教授願いたいです。
該当のソースコード
Java
1abstract public class Item { 2 public int id; 3 public String name; 4}
Java
1public class ItemA extends Item { 2 public int id; 3 public String name; 4 public int value; 5}
Java
1public class ItemB extends Item{ 2 public int id; 3 public String name; 4 public String value; 5}
Database
1ItemA 2id|name|value(Int) 31|abc|123 42|ghi|456 5... 6 7ItemB 8id|name|value(String) 91|def|apple 102|abc|banana 11...
###9/4 17:15 追記
Java
1//MainActivity 2 ListView listView; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 listView = (ListView) findViewById(R.id.listview); 10 ItemAdapter adapter=new ItemAdapter(this); 11 listView.setAdapter(adapter); 12 13 String[] itemNames=... //ItemAとItemBのdatabaseからname要素のみを取り出し、ソートした配列を用意 14 15 for(int i=0;i<itemNames.length;i++){ 16 adapter.add(itemNames[i]); //Itemインスタンスではなく、先ほどのitemNamesの配列をAdapterにセット 17 /*nameのみの配列をAdapterに渡してしまうと、後々ItemAかItemBで別々のクリックイベントを持たせたいときに識別する方法がなくなる。 18 *また、同名のものにも対応ができない。 19 *前もってItemをインスタンス化してその配列をセットしてもいいが、このviewには15個あるフィールドのうちnameしか使わない。 20 なのでnameとは別にdatabaseからもってきたidの配列をカスタムAdapterにインスタンスとして持たせ、getViewの時にidとしてsetできないか考えた。*/ 21 } 22 23 } 24 public class ItemAdapter extends ArrayAdapter<String> { 25 public ItemAdapter(Context context){ 26 super(context,R.layout.list_row); 27 } 28 29 @Override 30 public View getView(int position, View convertView, ViewGroup parent){ 31 if(convertView==null){ 32 convertView=getLayoutInflater().inflate(R.layout.list_row,null); 33 } 34 //ItemAdapterに持たせているItemのnameリストから呼び出し 35 String str =getItem(position); 36 37 //textViewにitemのnameのみをセット、このtextViewにクリックイベントを持たせようとしても識別できない 38 TextView textTitle=(TextView)convertView.findViewById(R.id.text_title); 39 textTitle.setText(str); 40 return convertView; 41 } 42}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/04 08:19
2018/09/04 09:19
2018/09/05 05:27