JSONからリストビューを読み込むアプリケーションをビルドしようとしています。私はnotifyDataSetChangedを使用してリストビューを更新しようとすると、以下の例外が発生します。 NULLオブジェクト参照onCreateViewメソッド外のフラグメント内のListViewアダプタを更新します。
リストビューに 'ボイド com.example.android.Wordtrend.CustomArrayAdapter.notifyDataSetChanged()' を仮想メソッドを呼び出す
試みは、フラグメント内にあります。 ImはonPostExecuteメソッドを使用して、フラグメント内のupdateメソッドを呼び出してArrayAdapterを更新します。 UIはonCreateViewメソッドで提供されたダミーデータを読み込みますが、更新中には失敗します。
初心者ですから、アドバイスが非常に役に立ちます。 ArrayAdapterがnullであり、updateメソッド内でdataArrayのサイズがゼロであるため、混乱しています。
アクティビティー:クラスからの更新メソッドを呼び出す
public class ClassicFragment extends Fragment { CustomArrayAdapter adapter; ArrayList<dataobjects> dataArray=new ArrayList<>(); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { dataArray.clear(); dataArray.add(new dataobjects("word","Explanation",R.drawable.placeholder,R.raw.color_black)); dataArray.add(new dataobjects("word","Explanation",R.drawable.placeholder,R.raw.color_black)); dataArray.add(new dataobjects("word","Explanation",R.drawable.placeholder,R.raw.color_black)); View rootView=inflater.inflate(R.layout.word_list,container,false); ListView listView=(ListView)rootView.findViewById(R.id.list); adapter=new CustomArrayAdapter(getActivity(),dataArray,R.color.classic); listView.setAdapter(adapter); return rootView; } public void update(ArrayList<FinalData> e){ ArrayList<dataobjects> newDataArray=new ArrayList<>(); // update Adapter from JSON for(int i=0;i<e.size();i++) { FinalData FinalDataObject = e.get(i); String word=FinalDataObject.getWord(); String meaning=FinalDataObject.getMeaning(); newDataArray.add(new dataobjects(word,meaning,R.drawable.placeholder,R.raw.color_black)); } Log.d("Classic"," Size of Data"+dataArray.size()); // Shows zero but im not clearing it manually. Should be two. dataArray.addAll(newDataArray); // Size changes to 7 as expected. adapter.notifyDataSetChanged(); }
// Dataprocess
:パブリッククラスClassicActivityがAppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activitycategory); getSupportFragmentManager().beginTransaction().replace(R.id.container,new ClassicFragment()).commit(); } }
フラグメントを拡張
public class Data extends AsyncTask<String,Void,String> { String Mdata; @Override protected void onPostExecute(String s) { Mdata=s; Dataprocess d=new Dataprocess(); d.process(Mdata); super.onPostExecute(s); }.....} public class Dataprocess { Finaldata f; ArrayList<Finaldata> wordList=new ArrayList<>(); ClassicFragment classicfragment=new ClassicFragment(); public void process(String s){ if(s!=null){ try { JSONObject data = new JSONObject(s); JSONArray word = data.getJSONArray("WordArray"); for (int i = 0; i < word.length(); i++){ JSONObject c = word.getJSONObject(i); String word1=c.getString("word"); String meaning=c.getString("meaning"); f=new Finaldata(word1,meaning); wordList.add(f); } classicfragment.update(wordList); }catch (Exception e){ } } } }
のCustomArrayアダプタ:onActivityCreatedメソッド内のすべてのコードを入れて
public class CustomArrayAdapter extends ArrayAdapter<dataobjects> { int color; public static MediaPlayer mediaPlayer; static AudioManager am; private TextToSpeech tts; static MediaPlayer.OnCompletionListener oncom=new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { release(); } }; public CustomArrayAdapter(Activity context, ArrayList<dataobjects> a, int color) { super(context,0,a); this.color=color; } @Override public View getView(int position, View convertView, ViewGroup parent) { View listitemview=convertView; if(listitemview==null){ listitemview= LayoutInflater.from(getContext()).inflate(R.layout.customlayout,parent,false); } dataobjects currentword=getItem(position); TextView t1=(TextView)listitemview.findViewById(R.id.textView); TextView t2=(TextView)listitemview.findViewById(R.id.textView2); View background1=listitemview.findViewById(R.id.back); View background2=listitemview.findViewById(R.id.back2); background1.setBackgroundColor(colorid); background2.setBackgroundColor(colorid); int ex=currentword.getImageURL(); int aud=currentword.getSound(); t1.setText(currentword.getWord()); t2.setText(currentword.getTransalation()); int colorid= ContextCompat.getColor(getContext(),color); ImageView im1=(ImageView)listitemview.findViewById(R.id.media); im1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { test(); } }); return listitemview; }
キーはupdate()を呼び出す場所と場所であり、その部分はありません! – rupps
私の無知を残念に思う。詳細を追加して投稿を編集しました。 –