2011-10-22 3 views
0

ここに、Androidアプリケーション用のMy GridViewの実装があります。 プログラムのために初めてそれはうまく動作します。しかし、いくつかのスクロールアップとダウンをした後 私の問題は、グリッドビューで私はいくつかの時間を予期しない位置に間違ったtextviewを入れてスクロールします。Unrood GridViewで期待されるデータセットの動作モバイル時に着陸するポートまたは着陸するポートに変更する

GridViewアダプタのソースコードは以下のとおりです。ここで

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mGridView=(GridView)findViewById(R.id.gridview_id); 
    InitializeVariable(); 
    mGridView.setAdapter(new GridAdapter(GridViewExampleActivity.this)); 
    mGridAdapter=new GridAdapter(GridViewExampleActivity.this); 
    // mGridView.setEnabled(false); 
    mGridView.setOnLongClickListener(this); 
    mGridView.setOnItemClickListener(this); 

} 

    public class GridAdapter extends BaseAdapter{ 
    public Context mContext_GridAdapter=getApplicationContext(); 

    GridAdapter(Context context){ 
     this.mContext_GridAdapter=context; 
    } 

    @Override 
    public int getCount() { 

     return Fix_Grid_View; 
    } 

    @Override 
    public Object getItem(int position) { 

     return position; 
    } 

    @Override 
    public long getItemId(int position) { 

     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     RelativeLayout mRelative_Box_Grid; 
     TextView mTextView; 
     View v; 
     if(convertView==null){ 
      mLayoutInflater=LayoutInflater.from(GridViewExampleActivity.this); 
      v=mLayoutInflater.inflate(R.layout.relative_box_view, null); 
      mTextView=(TextView)v.findViewById(R.id.txt_number); 
      mRelative_Box_Grid=(RelativeLayout)v.findViewById(R.id.relative_view); 
      mRelative_Box_Grid.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT,Device_Height)); 
      mRelative_Box_Grid.setPadding(2, 2, 2, 2); 
      mTextView.setTextSize(Fix_Text_Size); 
      mTextView.setText(String.valueOf(position)); 
      mTextView.setId(position); 

     }else{ 
      v=convertView; 
     } 
     return v; 
    } 

} 

私は風景モード用のres /レイアウト-土地で同じmain.xmlファイルを入れて、私のメインのxmlファイル

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<GridView android:numColumns="3" 
    android:stretchMode="columnWidth" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:id="@+id/gridview_id" 
    android:longClickable="true" 
    ></GridView> 
</LinearLayout> 

です。

と私はまた、オリエンテーション

android:configChanges="orientation" 

にハンドルの変更のための私のAndroidManifestファイルに次の行を追加し、私たちがここで目に見えないために行って、そのためのコードであるTextViewのその位置に任意の項目をクリックしたときに私も実装しています。

@Override 
public void onItemClick(AdapterView<?> AdapterView, View view, int position, long arg3) { 

    int Child_Count; 
    RelativeLayout mRelativeLayout; 
    TextView mTextView; 

    try{ 
     Toast.makeText(GridViewExampleActivity.this, "Position "+ position, 600).show(); 
     Child_Count=AdapterView.getChildCount(); 
     mRelativeLayout=(RelativeLayout) AdapterView.getChildAt(position); 
     mTextView=(TextView) mRelativeLayout.getChildAt(0); 
     mTextView.setVisibility(View.INVISIBLE); 
     // mGridAdapter.notifyDataSetChanged(); 
     // mGridView.setAdapter(mGridAdapter); 
     Log.v(TAG, "Child Count is"+ Child_Count); 
    }catch(Exception e){ 
     Log.v("log", " Mes"+TAG +e.getMessage()); 
    } 


} 

この機能の作業もなく、Ctrlキー+ F11キーを使用して、私のエミュレータでは、いくつかの向きの変更を行った後、いくつかの時間のために失敗します。 ここに私のInflater View XMLファイルがあります。

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:background="@drawable/rectangle_white" 
android:id="@+id/relative_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<TextView android:text="@string/hello" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:id="@+id/txt_number"/> 
    </RelativeLayout> 

ここでは、問題iのデモアプリケーションのリファレンスイメージを取得します。

enter image description here

For landscape

最初のイメージを見、私が上にスクロールし、TextViewのインターチェンジの値ダウン予期しない

と11からアンドロイド携帯もいくつかの時間開始の景観ビューで同じ変更することをそのようなやり方で起こるべきではない。一見

答えて

0

は、私は次のように注意してください:

mGridView=(GridView)findViewById(R.id.gridview_id); 
InitializeVariable(); 
mGridView.setAdapter(new GridAdapter(GridViewExampleActivity.this)); 
mGridAdapter=new GridAdapter(GridViewExampleActivity.this); 

は、なぜあなたは2 GridAdaptersを作成するのですか?

さらに
mGridView=(GridView)findViewById(R.id.gridview_id); 
InitializeVariable(); 
// Create the GridAdapter 
mGridAdapter=new GridAdapter(GridViewExampleActivity.this); 
// Set the Adapter tp the gridview 
mGridView.setAdapter(mGirdAdapter); 

、アダプタのGetViewメソッドのためのあなたのコードを見てみましょう: は、私はあなただけなので、のようなものが必要だと思うでしょう。 Androidはできるだけビューを再利用しようとします。 convertView == nullの場合、ビューをインスタンス化するだけです。ポピュレートされた最初のビューに対してのみ表示されます。

スクロールした後、Androidはそれらのビューを再利用しようとします。したがって、convertViewはnullにはならず、ビューにテキストを設定するコードは実行されません。あなたのAdapter

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    RelativeLayout mRelative_Box_Grid; 
    TextView mTextView; 
    View v; 

    // Assign the re-usable view to v 
    v = convertView; 

    if(v==null){ 
     // Create views if v == null 
     mLayoutInflater=LayoutInflater.from(GridViewExampleActivity.this); 
     v=mLayoutInflater.inflate(R.layout.relative_box_view, null); 

     // NOTE: This will only be executed for the Views that will be 
     // visible initially (so, for 0 through 11) 
    } 

    // Setup your view to show the proper values 
    // NOTE: This will always be executed 
    mTextView=(TextView)v.findViewById(R.id.txt_number); 
    mRelative_Box_Grid=(RelativeLayout)v.findViewById(R.id.relative_view); 
    mRelative_Box_Grid.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT,Device_Height)); 
    mRelative_Box_Grid.setPadding(2, 2, 2, 2); 
    mTextView.setTextSize(Fix_Text_Size); 
    mTextView.setText(String.valueOf(position)); 
    mTextView.setId(position); 

    return v; 
} 

幸運

+0

"convertView == nullのときはビューをインスタンス化するだけです - 正確に彼がやっていることではありません(if(convertView == null))?ここで重要なのは、mTextView.setText(String.valueOf(position))を移動することです。 return文のすぐ上になるようにします。 –

+0

まさに!私はインスタンス化と初期化を意味しました。彼のテキストビューのテキストが設定されていないことを示すために、コメント付きのコードを追加しました。そして、それを修正する方法 – Entreco

+0

@Entreco私はあなたがそれが失敗し、ランタイムエラーを与えることを記述したとして移動しようとします – Herry

1

、これらの行に移動してみてください:これに変更し、ちょうどあなたのreturn文の上にあることを

mTextView=(TextView)v.findViewById(R.id.txt_number); 
mTextView.setText(String.valueOf(position)); 

を:

return v; 

また、私は確信していませんが、私はあなたがラインを必要とは思わないmTextView.setId(position);、位置のビューは、onClickコールバックで提供されています。

+0

@Hello iPaulProレスポンスありがとうございます。私もあなたも考えてみませんか?10-22 23:48:49.152:ERROR/AndroidRuntime (897):java.lang.NullPointerExceptionとはるかに多くのエラーリスト。 – Herry

+0

@Herry - 申し訳ありませんが、mTextView =(TextView)v.findViewById(R.id.txt_number)も移動する必要があります。私はそれに応じて答えを更新しました。 ViewHolderパターンを調べることができます(APIDemosのList14.javaをチェックしてください)。 –

+0

@Thanks for Help iPaulPro – Herry

関連する問題