2016-08-25 13 views
-1

私は、リストビューを表示する3つのアクティビティがあり、アイコンとテキストビューを表示してデータを表示するイメージがあります。私は、これらのアクティビティで自分のリストビューに一般的に使用できるアダプタを作成したいと考えています。しかし、私は私のアプリを実行すると、logcatは私にnullポインタの例外を表示します。なぜ、ビューは、アンドロイドでnullを返す

8月25日22:43:04.090 28942から28942/com.example.xiaoking.dilibusのA /技術:技術/実行/ thread.cc:1113] '仮想メソッドを起動しようとする' 新しい例外をスローするブールandroid.view.View.isSelected() '予期しない保留中の例外を伴うnullオブジェクト参照':java.lang.NullPointerException:NULLオブジェクト参照で仮想メソッド 'int android.view.View.getImportantForAccessibility()'を呼び出そうとしました

このエラーの理由はわかります。私のconvertviewはnullを返します。しかし、私はなぜそれを修正できるのか分かりません。ここで

は私のアダプタです:

List listObjects; 
Context context; 
ViewHolder viewHolder; 
int typeOfObject; 

public CustomCityAdapter(Context context, List objects) { 
    this.listObjects = objects; 
    this.context = context; 
} 

public CustomCityAdapter(Context context, List objects, int typeOfObject) { 
    this.listObjects = objects; 
    this.context = context; 
    this.typeOfObject = typeOfObject; 
} 

public void setArrayListCity(List listObjects) { 
    this.listObjects = listObjects; 
} 

@Override 
public int getCount() { 
    return listObjects.size(); 
} 

@Override 
public Object getItem(int position) { 
    return listObjects.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    City city = new City(); 
    getObject(city,position,convertView,parent); 
    viewHolder.textView.setText(city.getCityName()); 
    return convertView; 
} 

private void getObject(Object object, int position, View convertView,ViewGroup parent){ 
    object = getItem(position); 
    if(convertView == null) { 
     convertView = LayoutInflater.from(context).inflate(R.layout.custom_cell_list_cities, parent, false); 
     viewHolder = new ViewHolder(); 
     viewHolder.textView = (TextView) convertView.findViewById(R.id.tv_cell_item_city); 
     convertView.setTag(viewHolder); 
    } 
    else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
} 
ここ

が私の活動です:

Toolbar toolbar; 
CustomCityAdapter myAdapter; 
ArrayList<City> arrCities = new ArrayList<City>(); 
CustomListView myListView; 
CoordinatorLayout viewCoordinatorLayout; 
boolean isDownloadSuccess = true; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_choosing_city); 
    findViewByID(); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    loadCityToListView(); 
    //downloadAndInsertCityToDB(); 
    myListView.setCities(arrCities); 
    myListView.myListViewSetOnClickListener(this, SearchingTicketActivity.RESULT_CODE_SAVE); 
    Log.d("Test","OncreateChoosing"); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    loadCityToListView(); 
} 

@Override 
public void findViewByID() { 
    toolbar = (Toolbar) findViewById(R.id.choosing_city_activity_toolbar); 
    myListView = (CustomListView)findViewById(R.id.lv_cities); 
    viewCoordinatorLayout = (CoordinatorLayout)findViewById(R.id.coordinatorLayoutChoosing); 
} 

@Override 
public void setOnClickListener() { 
    super.setOnClickListener(); 
} 

private void loadCityToListView() { 
    arrCities = DiLiBusDatabaseHelper.getInstance(this).getListCities(); 
    // CustomListView myListView = new CustomListView(this); 
    myAdapter = new CustomCityAdapter(this, arrCities); 
    myListView.setAdapter(myAdapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_choosing_city, menu); 
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
    searchView.setMaxWidth(Integer.MAX_VALUE); 
    searchView.setOnQueryTextListener(this); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    return true; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 

    return setOnQueryTextListenerSearchView(newText); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
} 

@Override 
protected boolean setOnQueryTextListenerSearchView(String query) { 
    if (query.equals("")) { 
     arrCities = DiLiBusDatabaseHelper.getInstance(this).getListCities(); 
     myAdapter.setArrayListCity(arrCities); 
     myAdapter.notifyDataSetChanged(); 
     myListView.setCities(arrCities); 
     return true; 
    } 
    arrCities = DiLiBusDatabaseHelper.getInstance(this).getListCityByName(query); 
    myAdapter.setArrayListCity(arrCities); 
    myAdapter.notifyDataSetChanged(); 
    myListView.setCities(arrCities); 
    Log.d("List Size: ", arrCities.size() + ""); 
    return true; 
} 

@Override 
public boolean onSupportNavigateUp() { 
    onBackPressed(); 
    return true; 
} 
+0

View.isSelectedメソッドを呼び出したアクティビティコードを示してください。私はisSelectedメソッドを呼び出す前に定義ビューが不足していたと思います。 –

+0

@HoàngVNam私はちょうど私の質問を編集しました。私は活動に問題がないと思います。 Bcuzリストビューが1つのリストオブジェクトだけをロードするようにコードを編集すると、完全に実行されます。 –

+0

私はちょうど私の答えを追加しています。チェックしてみましょう:http://stackoverflow.com/questions/7893492/is-java-really-passing-objects-by-value –

答えて

0

私はこの機能に問題が見つかりました:

getObject(city,position,convertView,parent); 

convertView = LayoutInflater.from(context).inflate(R.layout.custom_cell_list_cities, parent, false); 

convertView == nullの場合、getObjectメソッドでconvertViewに新しい値が割り当てられます。

しかし、convertViewはgetObjectメソッドでのみ値を持ち、getViewではgetObject(city、position、convertView、parent)以下の値を持ちます。 convertViewはnullです。

+0

あなたのおかげで、あなたの問題は正確であり、解決策はgetObjectを返すことです。本当にありがとう。 –

+0

あなたを助けてくれるニース:D –

関連する問題