2016-10-28 53 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; 
} 

当我尝试调试,我可以看到第一当位置为'0'时,btnHistory不为空。但之后,当位置为1时,btnHistory为空。

什么可能会出错?当两个textviews都不为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