2016-10-28 4 views
2

私はカスタムグリッドを作成しています。各行には1つのボタンと2つのテキストビューがあります。私は値を割り当てようとしています/プログラムごとにテキスト。私は両方のテキストビューのテキストを設定することができますが、findviewbyIdボタンはnullを返します。グリッドレイアウト内のボタンがヌルです

グリッドは次のようである:私はデバッグにしようとすると

<GridView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:numColumns="auto_fit" 
     android:verticalSpacing="10dip" 
     android:horizontalSpacing="10dip" 
     android:stretchMode="columnWidth" 
     android:gravity="center" 
     android:background="#FFFFFF" 
     android:padding="5dip" 
     android:id="@+id/gvMYActivitySearch" /> 

行レイアウトが

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal"> 

    <Button 
     android:id="@+id/btnHistory" 
     android:layout_width="wrap_content" 
     android:layout_height="35dp" 
     android:background="@drawable/button_background" 
     android:text="History"/> 

    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="wrap_content" 
     android:layout_height="35dp" /> 

    <TextView 
     android:id="@+id/tvContact" 
     android:layout_width="wrap_content" 
     android:layout_height="35dp" /> 

</LinearLayout> 

カスタムグリッドjavaファイルが

public class CustomGrid extends BaseAdapter { 

private Context mContext; 
private final String[] names; 
private final String[] Contact; 
private final String[] ID; 

public CustomGrid(Context c,String[] names,String[] Contact, String[] ID) { 
    mContext = c; 
    this.Contact = Contact; 
    this.names = names; 
    this.ID = ID; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return names.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View grid; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     //grid = new View(mContext); 
     grid = inflater.inflate(R.layout.myactivity_singlerow, null); 

    } else { 
     grid = (View) convertView; 
    } 

    TextView tvName = (TextView) grid.findViewById(R.id.tvName); 
    TextView tvContact = (TextView) grid.findViewById(R.id.tvContact); 
    Button btnHistory = (Button) grid.findViewById(R.id.btnHistory); 
    tvName.setText(names[position]); 
    tvContact.setText(Contact[position]); 
    if(btnHistory!=null) { 
     btnHistory.setId(Integer.parseInt(ID[position])); 


     btnHistory.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         new MainActivity().testButton(view.getId()); 

        } 
       } 
     ); 
    } 

    return grid; 
} 

のようなものですが、私は最初のために見ることができますpositionが '0'の時、btnHistoryはnullではありません。しかし、positionが1のとき、btnHistoryはnullです。

何かが間違っている可能性がありますか?両方のtextviewがnullでない場合、なぜbtnHistoryがnullですか?あなたのコードを改善するための

+0

あなたはViewHolderパターンを使用するか、アプリをクリーニング&再構築しようとしたことがありますか? –

+0

アダプタをgridviewに設定していますか? – Chisko

+0

getItem()で '名前を返す 'ことを試みるかもしれません – Chisko

答えて

1

コメント:どこかgetView

外 コールバック私はこのことを意味:

public class CustomGrid extends BaseAdapter implements OnClickListener { 
     if(btnHistory!=null) { 
      btnHistory.setId(Integer.parseInt(ID[position])); 
      btnHistory.setTag((Integer)view.getId()); 

      btnHistory.setOnClickListener(this); 
     } 

     public void onClick(View v) { 
      new MainActivity().testButton(v.getTag()); 
     } 
    } 
+0

これはどのようにして問題を解決しますか? 'View.inflate'は、私が知っている質問 –

+0

と同じコードを呼び出します。あなたのインフレータは奇妙な行動をとることができます。 – Vyacheslav

+0

@ cricket_007、私は正しくないかもしれません。しかし私は私の経験に基づいています。 – Vyacheslav

関連する問題