2015-06-04 4 views
1

Я пытаюсь реализовать пользовательский массив адаптер,разница между view.findViewById (R.id ....) и просто findViewById (R.id ...)

Проблемы моего кода авария, когда я использовать

ImageView imageView=(ImageView)findViewById(R.id.imageView); 

вместо

ImageView imageView=(ImageView)rowView.findViewById(R.id.imageView); 

где rowView является файл макета для ListView, что я infalted.

Почему это происходит, я думал rowView.findViewById (R.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"); 
    } 
} 

}

ответ

6

Для поиска в FindViewById для просмотра требуется контекст.

Если вы вызываете это из класса, который расширен с activity, вы можете просто использовать , потому что деятельность - это контекст.

Когда вы используете это в классе, который простирается fragment, вы должны использовать getactivity().findviewbyid

В вашем случае, так как вы используете, что в adapter, вам нужно найти Термическое представление в пределах listview row. так что вы используете view.findviewbyid

+0

Я отредактировал этот вопрос сейчас, пожалуйста, уточните –

+0

О, я получаю его, так как мой внутренний класс не расширяет активность, по умолчанию нет этого (контекста) .findViewById (...) , поэтому есть проблема, я прав? –

+0

Но из того, что вы говорите, почему не было предупреждения IDE или ошибки времени компиляции, когда я использовал findViewById без контекста, а класс Btw My CustomAdapter - это внутренний класс основной деятельности, который расширяет активность ... можете ли вы объяснить? –

3

findViewById() используется для поиска вида в макете вашего Activity. Это невозможно, например, в Fragment. view.findViewById() используется для просмотра вида внутри другого другого вида. Например, чтобы найти представление внутри вашего макета строки ListView. Ваше приложение падает без него, потому что просмотр, который вы ищете, находится внутри rowView. Используя обычный findViewById(), вы не найдете вид.

Смежные вопросы