[PR] この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

Androidプログラミング日記 (仮)  

グッタリ・・魔のCheckBox

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

share
 

 

 

CheckBox

更新さぼってましたが、色々作成していました(つд・)

これを使ったプログラムを作ってはやっぱウマくいかず。

「まぁ、、なくてもデキルシ・・」

てな感じで避けてきましたが、あるプログラムを作成するに

あたり、使用しなければボタンだらけだし画面がたくさんほしく

なるしになりそうなので、本気で勉強してみました。

イイワケデスガ。所詮素人なのでそのへんのトコロヲオネガイシマスネ

[CheckBox]

これなんですが、普通に使えばなんとも簡単に普通に機能するものなのです。

まずは簡単なやり方で作ってみました。

 

 

ファイル名「MainActivityjava」

001package com.example.checkboxtest;
002/*
003 * 3つのデータにチェックボックスがあり
004 * それぞれの行でチェックをオンオフすると
005 * どのデータのチェックをオンオフしたか
006 * 確認するプログラムです。
007 */
008 
009import java.util.ArrayList;
010import java.util.List;
011 
012 
013import android.app.Activity;
014import android.graphics.PixelFormat;
015import android.os.Bundle;
016import android.view.Display;
017import android.view.Menu;
018import android.view.MenuItem;
019import android.view.Window;
020import android.view.WindowManager;
021import android.widget.CheckBox;
022import android.widget.CompoundButton;
023import android.widget.CompoundButton.OnCheckedChangeListener;
024import android.widget.TextView;
025import android.widget.Toast;
026 
027public class MainActivity extends Activity implements OnCheckedChangeListener{
028    /*
029     * implements OnCheckedChangeListenerはチェックをタップした時に
030     * 呼び出されるタップ処理を効率よく簡単に実装させる
031     * ためのものです。
032     */
033 
034    /*
035     * メニューボタン用
036     * 終了だけ実装してます。
037     */
038    private static final int
039    MENU_ITEM0=0;
040 
041    //今回は使用しませんが画面の大きさを取得するためのもの
042    float disp_w;
043    float disp_h;
044 
045    //使用するデータが入っているクラスの登録
046    Hensu hensu = new Hensu();
047    /*
048     * データは3つなので個別にインスタンスしてもいいのですが
049     * やりたいプログラムとなるべく同じ変数を使ってわかりやすく
050     * しています。
051     */
052    static List<Object> objList = new ArrayList<Object>();
053 
054    //使用する部品
055    static CheckBox check1;
056    static TextView text1;
057 
058    static CheckBox check2;
059    static TextView text2;
060 
061    static CheckBox check3;
062    static TextView text3;
063 
064 
065    @Override
066    protected void onCreate(Bundle savedInstanceState) {
067        super.onCreate(savedInstanceState);
068 
069        requestWindowFeature(Window.FEATURE_NO_TITLE);
070        getWindow().setFormat(PixelFormat.TRANSLUCENT);
071        Window window = getWindow();
072        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
073        WindowManager manager = window.getWindowManager();
074        Display disp = manager.getDefaultDisplay();
075        disp_w = disp.getWidth();
076        disp_h = disp.getHeight();
077 
078        init();
079 
080    }
081 
082    //初期設定メソッド
083    public void init()
084    {
085        /*
086         * 3データを登録
087         */
088        for(int i=0;i<hensu.check.length;i++)
089        {
090            objList.add(new Object(hensu.check[i],hensu.Name[i]));
091        }
092 
093        findView();
094    }
095 
096    /*
097     * 画面に表示させるためのメソッド。
098     * 個別に設定しています。
099     */
100    public void findView()
101 
102    {
103        setContentView(R.layout.activity_main);
104 
105        /*
106         * findViewByIdでそれぞれの部品をイヂクルことが
107         * できるようになります。
108         */
109        check1 = (CheckBox)this.findViewById(R.id.checkbox1);
110        check2 = (CheckBox)this.findViewById(R.id.checkbox2);
111        check3 = (CheckBox)this.findViewById(R.id.checkbox3);
112 
113        text1 = (TextView)this.findViewById(R.id.textview1);
114        text2 = (TextView)this.findViewById(R.id.textview2);
115        text3 = (TextView)this.findViewById(R.id.textview3);
116 
117        setFindViewObj();
118 
119 
120    }
121 
122    /*
123     * ここで部品をイヂクッテます
124     */
125    public void setFindViewObj()
126    {
127        /*
128         * オブジェクトからチェック状態を取り出して部品に設定
129         * そのチェックボックスが押されたらOnCheckedChangeListenerに
130         * オブジェクトからテキストを取り出し部品に設定
131         *
132         * これをデータ3つ分やっています。
133         */
134 
135        check1.setChecked(objList.get(0).isCheck());
136        check1.setOnCheckedChangeListener(this);
137        text1.setText(objList.get(0).getName());
138 
139        check2.setChecked(objList.get(1).isCheck());
140        check2.setOnCheckedChangeListener(this);
141        text2.setText(objList.get(1).getName());
142 
143        check3.setChecked(objList.get(2).isCheck());
144        check3.setOnCheckedChangeListener(this);
145        text3.setText(objList.get(2).getName());
146 
147    }
148 
149    /*
150     * implements をやってるのとやってないのとでの違いは、メリットデメリット(リンスではない)
151     * があり、implements をやってないと上記setOnCheckedChangeListener(this)で実装することに
152     * なります。当然3つあるので3つ実装します。ごちゃごちゃしますね。そのかわりその場でやり
153     * たいことができます。変数のスコープとか関係なしにできたりします。
154     * implementsをやっている今回みたいな場合は、スッキリしますね。そのかわりしっかり変数同士
155     * の関係性や引数で何を渡されているかなどを知っておく必要がある感じですかね。
156     */
157    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
158        String str1 = "";
159        String str2 = "";
160        /*
161         * CompoundButton buttonView はCheckBoxしたCheckBoxそのものと思って下さい。
162         * boolean isChecked はチェックがはいったのかはいっていないのかです。
163         *
164         * ここではまずどのCheckBoxかを直接比べてみて、それぞれで動作を決定。
165         * あとで使うstr1にtextを設定、部品が参照しているObjListにチェック具合
166         * を設定しています。
167         *
168         */
169 
170        if(buttonView == check1)
171        {
172            str1 = text1.getText().toString();
173            objList.get(0).setCheck(isChecked);
174        }
175        if(buttonView == check2)
176        {
177            str1 = text2.getText().toString();
178            objList.get(1).setCheck(isChecked);
179        }
180        if(buttonView == check3)
181        {
182            str1 = text3.getText().toString();
183            objList.get(2).setCheck(isChecked);
184        }
185 
186        /*
187         * チェック状態でstr2を設定
188         */
189        if(isChecked == true) str2 = "ON!";
190        if(isChecked == false) str2 = "OFF!";
191 
192        /*
193         * 便利なトーストメソッドで表示
194         */
195        makeTost(str1+" "+str2,1);
196 
197        //これを呼び出すことで画面を更新
198        findView();
199 
200    }
201 
202 
203 
204    //オプションメニューに表示させるアイテム登録
205    @Override
206    public boolean onCreateOptionsMenu(Menu menu) {
207        super.onCreateOptionsMenu(menu);
208        MenuItem item0 = menu.add(0,MENU_ITEM0,1,"終了");
209        return true;
210    }
211 
212  //オプションメニューを選択した時の処理
213    public boolean onOptionsItemSelected(MenuItem item){
214    switch (item.getItemId()){
215    case MENU_ITEM0:
216        finish();
217    return true;
218    }
219    return true;
220    }
221    /*
222     * エラーなど確認用などに便利。おまけ
223     */
224    public void makeTost(String str,int id){
225        int tost = Toast.LENGTH_LONG;
226        if(id==1) tost = Toast.LENGTH_SHORT;
227        Toast toast = Toast.makeText(this.getApplicationContext(),
228                str, tost);
229        toast.show();
230    }
231 
232 
233 
234}
235 
236                        

 

 

 

ファイル名「Hensu.ava」,「Object.ava」

01package com.example.checkboxtest;
02 
03public class Hensu {
04    /*
05     * オブジェクトに入れ込むデータ群
06     */
07 
08    String[] Name = {
09            "アイアンマン","スタートレック","インデペンデンスデイ"
10            };
11 
12    boolean[] check =
13        {
14            false,false,false
15        };
16 
17}
18 
19 
20package com.example.checkboxtest;
21 
22public class Object {
23    /*
24     * メンバは2つ
25     * チェックされてるかいないかと
26     * 映画名
27     */
28    private boolean check;
29    private String name;
30 
31    Object(boolean check,String name)
32    {
33        this.setCheck(check);
34        this.setName(name);
35    }
36 
37    public boolean isCheck() {
38        return check;
39    }
40 
41    public void setCheck(boolean check) {
42        this.check = check;
43    }
44 
45    public String getName() {
46        return name;
47    }
48 
49    public void setName(String name) {
50        this.name = name;
51    }
52 
53 
54 
55}
56 
57 
58 
59                        
 

 

「問題はどこに!?」

どうでしょうか。こんな感じです。しかしこれだけ見るとすごい簡単にみえます。応用みききそうだし、構造も簡単だし。

しかし考えてみたら、データが少なくそれをチェックする場合よりも、データがスクロールするほどあり、その中からデータ をチェックしてなにかしたい。というほうが多いのです。

そんな場合、やはりListView。しかもアダプターを使用して自作の行を作ったりしますそれをrowとします。

ここを見るかたなら簡単に作れるでしょう。みなさんの問題も同じかと思います。

そうです、スクロールするほどのデータがあり、rowにチェックボックス部品を設定して、いざ稼働させると・・・

「チェックがキエル!」「へんなとこにチェックハイットル!」「そういやどこにタップ処理かけばいいんだ・・」

みたいな問題がいっぺんにたくさんでます。

問題は沢山の場所でいっぺんに起きています。まず考えるのは色々な問題がどこにどういうふうに起きているかを見えるようにしたい。デバック作業をしたいわけです。で考えるとチェックした時におかしなことになるのなら、チェックした瞬間を見えるようにして変数の変動などみればいいわけです。

さて、ここで問題が起こります。さきほど作成したプログラムでならそれは可能です。がアダプターを使うとrowは別のクラスに作ることが多いですね。row部品はアダプターで設定するということはアダプター側でタップ感知しなければいけません。

ではそうすればいいじゃないか!なのですが 、確かにやってみてもいいかもしれません。やるのが正しいでしょう。んで私もやってみました。するとどうでしょう。そして変数の変動などをみます。結果、ワケワカラン。ナンダコレ。ナンデコウナルンダYO!状態です。

色々なサイトを参考にしました。同じ症状になるので解決してみた!というサイトもありました。で考察してみますと、

タップした時の画面の状態がかならずしもそのチェックボタンを参照して変数に設定されているとは限らない・・・・

なにをいっているんだかわかりませんが、ようは、さきほど作ったプログラムと作ろうとしているプログラムの違いを見てみればわかります。

さきほどのプログラムは、明示的に、的確に、確実に、わかりやすく、3つのデータがそれぞれのCheckBoxに設定していてされています。当たり前ですね。

しかしアダプターを使用すると、よく見ると、1つのCheckBoxをArrayListやList分だけふやしてListViewに登録します。つまり、rowをたくさん勝手に増やすわけです。それぞれのrowに違いはありません。でもCheckBoxはそれぞれ違いがあるはずなので増やした分のCheckBoxを個別に記憶させておき参照すればいいかも・・・

それができたとします。しかし次に問題が、データ分だけのCheckBoxがいっぺんには登録されません。画面にでている分だけ登録されている感じになっています。

そうです。アダプターでは、画面に出現する分しか登録されていないっぽいのです。(つд・)

しかも作られたら別でCheckBoxを登録して、チェックしたら登録分だけすべて参照比較してみたのですが、期待したものと違います。確実に比較できるようにしたのですがそれでもだめ。

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   String str = "なし";
   int i=0;
   while(i < checkbox1.size())
   {
    if(checkbox1.get(i) == buttonView)
    {
     str ="同じのアッタヨ!";
     makeTost(str+" "+ i+"番目",0);
     mk.rm.objList.get(i).check = isChecked;
     break;
     }
     i++;
     }

    if(i == checkbox1.size()) makeTost(str+" i="+i,0);
}

checkbox1が記憶させたはずのCheckBoxです。これでやると、スクロールなしなら、表示されている分だけの判定は完璧でした。しかしスクロールさせると、以前登録されているCheckBoxと同じものが判定されてしまいます。いわゆる「使い回し」をしているわけです。なので渡された 値 = チェックされた場所のポジション = オブジェクトのポジション とは な ら な い わけです。

しかもですね、ここで想像するとわかると思うのですが、そもそもrowのポジション、いわゆる設定するオブジェクトのポジションを表す、この二つを一致させるためのメソッドを設定していません。rowで一番上のチェックをしてもそれがどのポジションかなんて、このアダプターではわからないのです。

わかるのは、オブジェクトのポジションのものを画面に表示させているということだけです。

なのでまずはこのポジションを保存させておくことが必要になります。

わかりにくいですがたとえば、オブジェクトの1,2,3,4,5番目まで表示させます、となるとCheckBoxは No1,2,3,4,5、を使おう。そしてスクロールして、オブジェクト15,16,17,18、19番目を表示させる時にもNo1,2,3,4,5、を使うということなので、まずは、今どのポジションが表示されているかを設定し、CheckBoxでの直接の判定はせずに、オブジェクトそのもので判定するべきなのかも・・ってことですね。そういう色々かぶっていることが、1個チェックしたはずなのにたくさんチェックされたり、スクロールしたらチェックが消えたりの要因と思われます。なので、チェック状態をオブジェクトごとに保存し、確実にチェックポジションとオブジェクトポジションをつなぎ合わせ保存、そこで更新。が一番いいのかもしれません。

でもこれだと更新のたびに画面が上部に移ってしまうので問題なんですよね・・(つд・)

でも改善点はみえてきました。しかしながらめんどくさそうなので、別の観点でそれを克服しました。

これまたメリットデメリット(リンスではない)があります。考え方は簡単で、

「ListViewタップでチェックを入れる」

これです。すごい簡単でした。作ってみました。

 

ファイル名「MainActivity.ava」

001package com.example.checkboxtest3;
002 
003import java.util.ArrayList;
004import java.util.List;
005 
006import android.os.Bundle;
007import android.app.Activity;
008import android.graphics.PixelFormat;
009import android.view.Display;
010import android.view.MenuItem;
011import android.view.View;
012import android.view.Window;
013import android.view.WindowManager;
014import android.widget.AdapterView;
015import android.widget.AdapterView.OnItemClickListener;
016import android.widget.ListView;
017import android.widget.Toast;
018 
019public class MainActivity extends Activity implements OnItemClickListener{
020        private static final int
021        MENU_ITEM0=0;
022 
023        float disp_w;
024        float disp_h;
025 
026        Hensu hensu = new Hensu();
027 
028        static ListAdapter objlistadapter;
029        ListView objlistview;
030        static List<Object> objList = new ArrayList<Object>();
031 
032    @Override
033    protected void onCreate(Bundle savedInstanceState) {
034        super.onCreate(savedInstanceState);
035        requestWindowFeature(Window.FEATURE_NO_TITLE);
036        getWindow().setFormat(PixelFormat.TRANSLUCENT);
037        Window window = getWindow();
038        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
039        WindowManager manager = window.getWindowManager();
040        Display disp = manager.getDefaultDisplay();
041        disp_w = disp.getWidth();
042        disp_h = disp.getHeight();
043 
044        init();
045    }
046 
047    public void init(){
048 
049        for(int i=0;i<hensu.Name.length;i++)
050        {
051            objList.add(new Object(hensu.check[i],hensu.Name[i]));
052        }
053 
054        findView();
055    }
056 
057    public void findView(){
058        setContentView(R.layout.listview);
059 
060        objlistview = (ListView)findViewById(R.id.listView1);
061        objlistview.setOnItemClickListener(this);
062        objlistadapter = new ListAdapter(this,objList);
063        objlistview.setAdapter(objlistadapter);
064 
065 
066    }
067 
068    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
069        if(objList.get(position).isCheck() == false)
070        {
071            objList.get(position).setCheck(true);
072            findView();
073        }
074        else if(objList.get(position).isCheck() == true)
075        {
076            objList.get(position).setCheck(false);
077            findView();
078        }
079 
080 
081    }
082 
083      //オプションメニューを選択した時の処理
084    public boolean onOptionsItemSelected(MenuItem item){
085    switch (item.getItemId()){
086    case MENU_ITEM0:
087        finish();
088    return true;
089    }
090    return true;
091    }
092    /*
093     * エラーなど確認用などに便利。おまけ
094     */
095    public void makeTost(String str,int id){
096        int tost = Toast.LENGTH_LONG;
097        if(id==1) tost = Toast.LENGTH_SHORT;
098        Toast toast = Toast.makeText(this.getApplicationContext(),
099                str, tost);
100        toast.show();
101    }
102 
103 
104}
105 
106                        

ファイル名「ListAdapter.ava」

01package com.example.checkboxtest3;
02 
03import java.util.List;
04 
05import android.content.Context;
06import android.view.LayoutInflater;
07import android.view.View;
08import android.view.ViewGroup;
09import android.widget.BaseAdapter;
10import android.widget.CheckBox;
11import android.widget.TextView;
12import android.widget.Toast;
13 
14 
15class ListAdapter extends BaseAdapter{
16    private Context context;
17    private List<Object> list;
18    public MainActivity mk;
19 
20    public ListAdapter(Context context,List obj) {
21        super();
22        this.context = context;
23        list = obj;
24        mk = (MainActivity)context;
25    }
26 
27    public int getCount() {return list.size();}
28    public Object getItem(int position) {return list.get(position);}
29    public long getItemId(int position) {return position;}
30 
31    public View getView(int position, View convertView, ViewGroup parent) {
32        ViewHolder_Kouka holder;
33        Object ob = (Object) getItem(position);
34 
35        if (convertView == null) {
36            LayoutInflater inflater = LayoutInflater.from(context);
37            convertView = inflater.inflate(R.layout.listview_row, null);
38 
39            holder = new ViewHolder_Kouka();
40            holder.h_checkbox = (CheckBox) convertView.findViewById(R.id.checkBox1);
41            holder.h_name = (TextView) convertView.findViewById(R.id.textView1);
42 
43            convertView.setTag(holder);
44        } else {
45            holder = (ViewHolder_Kouka) convertView.getTag();
46        }
47 
48        holder.h_checkbox.setChecked(ob.isCheck());
49        holder.h_name.setText(ob.getName());
50 
51        return convertView;
52    }
53 
54 
55class ViewHolder_Kouka {
56    CheckBox h_checkbox;
57    TextView h_name;
58}
59 
60    /*
61     * エラーなど確認用などに便利。おまけ
62     */
63    public void makeTost(String str,int id){
64        int tost = Toast.LENGTH_LONG;
65        if(id==1) tost = Toast.LENGTH_SHORT;
66        Toast toast = Toast.makeText(mk.getApplicationContext(),
67                str, tost);
68        toast.show();
69    }
70 
71 
72 
73}
74 
75 
76 
77                        

ファイル名「Hensu.ava」

01                                package com.example.checkboxtest3;
02 
03public class Hensu {
04 
05    String[] Name = {
06            "アイアンマン","スタートレック","インデペンデンスデイ","アバター","スカイキャプテン",
07            "トリプルX","ミッション・トゥ・マーズ","エボリューション","プルートナッシュ","フィフスエレメント",
08            "リディック","トランスフォーマー","マイノリティリポート","ハリーポッター","バビロンAD"
09            };
10 
11    boolean[] check =
12        {
13            false,false,false,false,false,
14            false,false,false,false,false,
15            false,false,false,false,false
16        };
17 
18}
19 
20                        

ファイル名「Object.ava」

01package com.example.checkboxtest3;
02 
03public class Object {
04    private boolean check;
05    private String name;
06 
07    Object(boolean check,String name)
08    {
09        this.setCheck(check);
10        this.setName(name);
11    }
12 
13    public boolean isCheck() {
14        return check;
15    }
16 
17    public void setCheck(boolean check) {
18        this.check = check;
19    }
20 
21    public String getName() {
22        return name;
23    }
24 
25    public void setName(String name) {
26        this.name = name;
27    }
28 
29 
30 
31}
32 
33                        

ファイル名「activity_main.xml」

01<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
02    xmlns:tools="http://schemas.android.com/tools"
03    android:layout_width="fill_parent"
04    android:layout_height="fill_parent"
05    tools:context=".MainActivity" >
06 
07    <TextView
08        android:layout_width="wrap_content"
09        android:layout_height="wrap_content"
10        android:layout_centerHorizontal="true"
11        android:layout_centerVertical="true"
12        android:text="@string/hello_world" />
13 
14</RelativeLayout>
15                        

ファイル名「listview.xml」

01<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
02    xmlns:tools="http://schemas.android.com/tools"
03    android:layout_width="fill_parent"
04    android:layout_height="fill_parent"
05    tools:context=".MainActivity" >
06 
07    <ListView
08        android:id="@+id/listView1"
09        android:layout_width="fill_parent"
10        android:layout_height="wrap_content"
11        android:layout_alignParentLeft="true"
12        android:layout_alignParentTop="true" >
13 
14    </ListView>
15 
16</RelativeLayout>
17                        

ファイル名「listview_row」

01<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
02    xmlns:tools="http://schemas.android.com/tools"
03    android:layout_width="fill_parent"
04    android:layout_height="fill_parent"
05    tools:context=".MainActivity" >
06 
07    <CheckBox
08        android:id="@+id/checkBox1"
09        android:layout_width="wrap_content"
10        android:layout_height="wrap_content"
11        android:layout_alignParentLeft="true"
12        android:layout_alignParentTop="true"
13        android:checked="false"
14        android:enabled="false"
15        android:focusable="false"
16        android:focusableInTouchMode="true" />
17 
18    <TextView
19        android:id="@+id/textView1"
20        android:layout_width="wrap_content"
21        android:layout_height="wrap_content"
22        android:layout_alignBaseline="@+id/checkBox1"
23        android:layout_alignBottom="@+id/checkBox1"
24        android:layout_alignParentRight="true"
25        android:layout_toRightOf="@+id/checkBox1"
26        android:gravity="center"
27        android:text="TextView" />
28 
29</RelativeLayout>
30                        
 

 

listview_rowのCheckBox部品のとこでandroid:enabled="false"としタップが効かないようにしています。ListViewの行をタップすることでチェックするようにしました。メリットは色々なことを考えないでチェックできるということ。デメリットは行タップでの動作がチェックしかできなくなることです。

ちなみにこのプログラムは完成していません。スクロールしてチェックするとわかりますが、スクロールが初期位置に戻ってしまいます。これをなんとかしなければいけないのもデメリットですね。

ListViewの位置を記憶できるメソッドがあります。それを使います。

listview_position = objlistview.getFirstVisiblePosition();
listview_y = objlistview.getChildAt(0).getTop();この二つでListViewのポジションを記憶できます。両方integer値です。

objlistview.setSelectionFromTop(listview_position, listview_y);で先ほどの値を渡すことでListviewを記憶した位置に設定することができます。これはアダプターの設定などの後に書いておくといい感じになります。

 

ファイル名「MainActivity.java」

001                                package com.example.checkboxtest3;
002 
003import java.util.ArrayList;
004import java.util.List;
005 
006import android.os.Bundle;
007import android.app.Activity;
008import android.graphics.PixelFormat;
009import android.view.Display;
010import android.view.MenuItem;
011import android.view.View;
012import android.view.Window;
013import android.view.WindowManager;
014import android.widget.AdapterView;
015import android.widget.AdapterView.OnItemClickListener;
016import android.widget.ListView;
017import android.widget.Toast;
018 
019public class MainActivity extends Activity implements OnItemClickListener{
020        private static final int
021        MENU_ITEM0=0;
022 
023        float disp_w;
024        float disp_h;
025 
026        Hensu hensu = new Hensu();
027 
028        static ListAdapter objlistadapter;
029        ListView objlistview;
030        static List<Object> objList = new ArrayList<Object>();
031 
032        int listview_position = 0;
033        int listview_y = 0;
034 
035    @Override
036    protected void onCreate(Bundle savedInstanceState) {
037        super.onCreate(savedInstanceState);
038        requestWindowFeature(Window.FEATURE_NO_TITLE);
039        getWindow().setFormat(PixelFormat.TRANSLUCENT);
040        Window window = getWindow();
041        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
042        WindowManager manager = window.getWindowManager();
043        Display disp = manager.getDefaultDisplay();
044        disp_w = disp.getWidth();
045        disp_h = disp.getHeight();
046 
047        init();
048    }
049 
050    public void init(){
051 
052        for(int i=0;i<hensu.Name.length;i++)
053        {
054            objList.add(new Object(hensu.check[i],hensu.Name[i]));
055        }
056 
057        findView();
058    }
059 
060    public void findView(){
061        setContentView(R.layout.listview);
062 
063        objlistview = (ListView)findViewById(R.id.listView1);
064 
065        objlistview.setOnItemClickListener(this);
066        objlistadapter = new ListAdapter(this,objList);
067        objlistview.setAdapter(objlistadapter);
068        //ここでスクロール位置を設定
069        objlistview.setSelectionFromTop(listview_position, listview_y);
070 
071 
072 
073    }
074 
075    public void setObjList(){
076        setContentView(R.layout.listview);
077    }
078 
079    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
080        if(objList.get(position).isCheck() == false)
081        {
082            objList.get(position).setCheck(true);
083 
084        }
085        else if(objList.get(position).isCheck() == true)
086        {
087            objList.get(position).setCheck(false);
088        }
089 
090        //ここでスクロール位置を記憶
091        listview_position = objlistview.getFirstVisiblePosition();
092        listview_y = objlistview.getChildAt(0).getTop();
093        findView();
094    }
095 
096      //オプションメニューを選択した時の処理
097    public boolean onOptionsItemSelected(MenuItem item){
098    switch (item.getItemId()){
099    case MENU_ITEM0:
100        finish();
101    return true;
102    }
103    return true;
104    }
105    /*
106     * エラーなど確認用などに便利。おまけ
107     */
108    public void makeTost(String str,int id){
109        int tost = Toast.LENGTH_LONG;
110        if(id==1) tost = Toast.LENGTH_SHORT;
111        Toast toast = Toast.makeText(this.getApplicationContext(),
112                str, tost);
113        toast.show();
114    }
115 
116 
117}
118 
119                                

 

これを実行してみて下さい。ウマくいくはずです。しかし

ウスウス気づいている人もいるかもしれません・・・そうですこれは所詮逃げです!!

とりあえずもう一回勉強しなおすことにします(つд・)

<

 

 

 

 

 

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です