我正在尝试实现自定义阵列适配器,
问题是我使用
时代码崩溃了 ImageView imageView=(ImageView)findViewById(R.id.imageView);
而不是
ImageView imageView=(ImageView)rowView.findViewById(R.id.imageView);
其中rowView是我已经实施的ListView的布局文件。
为什么会发生这种情况,我认为rowView.findViewById(R.id ..)只会让它更快地通过id找到元素,但没有它应用程序崩溃, 你能解释一下吗
这是我的活动代码
公共类MainActivity扩展了AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Now for the list view
ListView listView=(ListView)findViewById(R.id.listView);
String[] values =new String[]{"iOS","android","firefoxOs","Ubuntu"};
MySimpleAdapter simpleAdapter=new MySimpleAdapter(this,values);
listView.setAdapter(simpleAdapter);
//
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
class MySimpleAdapter extends ArrayAdapter<String>{
private Context context;
private String[] values;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//listView calls this on its adapter for each row
Log.v("list","getView");
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView=inflater.inflate(R.layout.custom_row,parent,false);
TextView textView1= (TextView) rowView.findViewById(R.id.textView1);
textView1.setText(values[position]);
//for the android row alone set an image , others leave it as blank
if(values[position].startsWith("and"))
{
ImageView imageView=(ImageView)rowView.findViewById(R.id.imageView);
imageView.setImageResource(R.drawable.ic_launcher);//Ok R.drawale....is also an id
}
return rowView;
}
public MySimpleAdapter(Context context,String[] values) {
super(context, R.layout.custom_row,values);
this.context=context;
this.values=values;
Log.v("list","constructor");
}
}
}
答案 0 :(得分:7)
findViewById总是需要一个上下文来查找视图。
如果从扩展Activity
类的类中调用它,则可以使用findViewById
,因为Activity是上下文。
当您从扩展fragment
的类中调用它时,您必须使用getActivity().findViewById
在您的情况下,由于您是在adapter
中调用它,因此您需要在listview row
内找到该视图。所以你使用view.findViewById
答案 1 :(得分:4)
findViewById()
用于在Activity
的布局中查找视图。例如,在Fragment
中无法做到这一点。 view.findViewById()
用于在特定的其他视图中查找视图。例如,在ListView
行布局中查找视图。您的应用在没有它的情况下崩溃,因为您要搜索的视图位于rowView
内。使用普通findViewById()
,您将找不到视图。