新人成長記録3rd

毎度のことながら、Androidを猛勉強中のpoppyです。

ここ最近はAndroidのプログラミングが難しく感じてきました。
特に
【ListViewに任意(動的)なViewを入れる】
【Fragmentの中で動的レイアウトの作成】
この2つ
gatag-00003478

記事にすることで自分自身、どこまで理解できているかの指針にもなるので、
書いていこうとおもいます。

主にプログラムでの紹介になっていきます。


今までは、なんとかなってた。
文字を表示したいならTextViewというオブジェクトを作って、それを編集していく感じ。
レイアウトをセットしたいならsetContentView(TextView)とすれば画面に表示される。

目的のListViewを生成するには、今までより多少複雑になりました。

ListViewへ動的なViewの挿入

単純なものだとListViewは、事前に作成されたレイアウトを
使用することで完了します。

プログラム例:


//ListViewの宣言
//リスト化する項目の作成
ListView listView = new ListView(this);
//任意のアイテムを表示
ArrayList items = new ArrayList();
items.add("1");
items.add("2");
//リストをアダプタへ挿入
//アダプタはデータと出力をつなげる中間管理職!
//itemsを1つ1つ,指定したレイアウトで出力する
ArrayAdapter adapter = new ArrayAdapter
        this,android.R.layout.simple_list_item_1,items);
//ListViewへアダプタをセット
listView.setAdapter(adapter);
//表示するビューを指定
setContentView(listView);

固定のレイアウトで表示するならばこれでよいのですが、
アンケートでは、各設問の種類も自由記入、チェックボックス、ラジオボタンとバラバラ…。
回答項目も設問によって個数はバラバラ…。
今回はアンケートなので動的にレイアウトを作成していきたい!

例としてListVewは、以下のように作成できます。
まずはデータの基となるListを作成します。


//カスタムクラス
//ListViewに入れる1つ1つのデータの基
public class testData{
    private String name;
    private int age;
    private String address;
    //コンストラクタ
    public testData(String name, int age){
        this.name = name;
        this.age = age;
        //これくらいなら呼び出し時にnew testData(name, age, "")の方が単純かな…。
        this.address = "";
    }
    
    public testData(String name, int age, String address){
        this.name = name;
        this.age = age;
        this.address = address;
    }
    //名前の取得
    public String getName(){
        return this.name;
    }
    //年齢の取得
    public int getAge(){
        return this.age;
    }
    //住所の取得
    public String getAddress(){
        return this.address;
    }
}

 

次にAdapterを独自に改良していきます。
こちらが理解できるまでに時間がかかりました。


//カスタムアダプタ
//引数としてContextとtestDataで作成したlistを受け取る
//importは省略
public class customAdapter extends ArrayAdapter {

    private List list;

    //コンストラクタ
    public customAdapter(Context context, List list){
        //スーパークラスのコンストラクタへ
        super(context, 0, list);
        this.list = list;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        //positionはlistの中でどの位置にあたるかを持っている
        //convertViewは実際に描画されるlist1つ1つのビュー、これを使っていく
        //parentは親のビューグループ
        Context context = getContext();

        //listのposision位置の情報をitemへ
        //item.getNameでnameが取得できる
        testData item = list.get(position);

        //1つの項目をまとめるLinearLayout
        LinearLayout layout = new LinearLayout(getContext());
        //縦方向に並ぶように
        layout.setOrientation(LinearLayout.VERTICAL);

        TextView tv_name = new TextView(context);
        tv_name.setText(String.valueOf(item.getName()));
        layout.addView(tv_name);

        TextView tv_age = new TextView(context);
        tv_age.setText(String.valueOf(item.getAge()));
        layout.addView(tv_age);

        if(!String.valueOf(item.getAddress()).equals("")){
            TextView tv_add = new TextView(context);
            tv_add.setText(String.valueOf(item.getAddress()));
            layout.addView(tv_add);
        }

        convertView = layout;
        return convertView;
    }
}

 

最後にActivityでの動作ですね。
Activityでやることはあまりなく、作成したデータ型のListにデータを詰め込み
listViewにアダプタをセットする際にカスタムしたアダプタにレイアウトを作ってもらうのみです。


//importは(ry
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //testData型のListを作成
        List list = new ArrayList();
        //データを追加していく
        list.add(new testData("C君",11,"大阪"));
        list.add(new testData("java様",64));
        list.add(new testData("PHPさん",20,"北海道"));

        ListView listView = new ListView(this);
        //ListViewにアダプタをセットする時にlistをもとにレイアウトの作成をする
        listView.setAdapter(new customAdapter(this,list));
        setContentView(listView);
    }
}

うまく説明できているかはわかりません!
簡単な例でしたが以上で、動的にListViewを作成することができます。

WARNIG!!

この方法でアンケートを作っていると問題が発生しました。
EditTextへフォーカスを合わせて文字を入力しようとしても、
うまく入力できないのです!

調査結果
ListViewの中のViewでEditTextを使用すると文字を入力して
キーボードの表示や入力候補の表示でgetViewが呼び出されている…。
そのおかげで、EditTextからフォーカスがはずれて入力ができないみたいです。
フォーカスを記憶してフォーカスしなおす手があるみたいですが、
私はScrollViewを使用することにしました。

意外と長く、文字ばかりになってしまいました。
読んでるみなさんも大変ですから、Fragmentについては次回にします!
見やすい記事作りも勉強していきたいと思っております!

火曜日担当:poppyからでした。



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム