2016-02-25 2 views
0

У меня есть три вкладки, каждая из которых должна показывать конкретные данные, полученные с сервера. Я создал только один фрагмент, который должен показывать различную информацию, на основе которой открыта вкладка, однако когда приложение запускает только одну вкладку, отображается информация, и через некоторое время она падает на линии, когда я создаю новый NamesAdapter`только один из трех скользящих вкладок показывает данные

public class TabFragment extends Fragment { 

    private static final String TAG = "TabFragment"; 
    int page; 
    private ArrayList<Names> namesList; 
    NamesAdapter adapter; 
    ListView listView; 


    public TabFragment() { 
     // Required empty public constructor 
    } 

    public static TabFragment newInstance(int page) { 
     TabFragment fragment = new TabFragment(); 

     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     namesList = new ArrayList<>(); 
     listView = (ListView) getActivity().findViewById(R.id.listView); 
     // Inflate the layout for this fragment 
     new MyTask().execute(); 

     return inflater.inflate(R.layout.fragment_tab, container, false); 


    } 

    private class MyTask extends AsyncTask<String, String, Boolean> { 


     @Override 
     protected Boolean doInBackground(String... params) { 

      String content = HttpManager.getData("http://union.ge/catalog/1455299520.json"); 

      Log.e("doInBackground", "was called"); 
      //return content; 

      try { 
       JSONArray json= new JSONArray(content); 

       // get json objects one by one 

       for (int i = 0; i < json.length(); i++){ 

        Names names = new Names(); 
        // this json object now has key-value pairs and 
        JSONObject jRealObject = json.getJSONObject(i).getJSONObject("name"); 
        //Log.e("jrealobject", jRealObject.toString()); 

        names.setEn(jRealObject.getString("en")); 
        names.setGe(jRealObject.getString("ge")); 
        names.setRu(jRealObject.getString("ru")); 

        //migebuli monacemebi shevinaxot chvens array-shi 
        namesList.add(names); 

       } 

       return true; 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return false; 

     } 

// on postExecute method runs on the UI thread 

      protected void onPostExecute(Boolean b) { 
       super.onPostExecute(b); 

       if(b){ 

        adapter = new NamesAdapter(getContext(), R.layout.list_item, namesList, page); 
        Log.e(TAG, String.valueOf(page)); 

        listView = (ListView) getActivity().findViewById(R.id.listView); 
        listView.setAdapter(adapter); 

       } else { 
        Toast.makeText(getActivity(), "data was not parsed", Toast.LENGTH_SHORT).show(); 
       } 
      } 
    } 


} 

`

public class TabsAdapter extends FragmentPagerAdapter { 


    final static int PAGE_COUNT = 3; 
    private static final String TAG = "TabsAdapter"; 
    private String tabTitles[] = new String[] { "EN", "GE", "RU" }; 
    private Context context; 


    public TabsAdapter(FragmentManager fm, Context context) { 
     super(fm); 
     this.context = context; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       return TabFragment.newInstance(0); 
      case 1: 
       return TabFragment.newInstance(1); 
      case 2: 
       return TabFragment.newInstance(2); 
      default: 
       return null; 
     } 

    } 

    @Override 
    public int getCount() { 
     return PAGE_COUNT; 
    } 

    public CharSequence getPageTitle(int position) { 
     // Generate title based on item position 
     return tabTitles[position]; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 
     FragmentManager manager = ((Fragment)object).getFragmentManager(); 
     android.support.v4.app.FragmentTransaction trans = manager.beginTransaction(); 
     trans.remove((Fragment)object); 
     trans.commit(); 
    } 



} 

и адаптер для имен класса

public class NamesAdapter extends ArrayAdapter<Names> { 

    private static final String TAG = "NamesAdapter"; 
    ArrayList<Names> items; 
    Context context; 
    int resource; 
    int page; 

    LayoutInflater vi; 


    public NamesAdapter(Context context, int resource, ArrayList<Names> items, int pageNumber) { 
     super(context, resource, items); 

     this.context = context; 
     this.resource = resource; 
     this.items = items; 
     this.page = pageNumber; 


     vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder; 

     if (convertView == null){ 

      // convertView = vi.inflate(resource, null); 
      convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); 
      viewHolder = new ViewHolder(); 

      viewHolder.textView = (TextView) convertView.findViewById(R.id.textView); 

      convertView.setTag(viewHolder); 

     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 


     switch (page) { 
      case 0: 
       viewHolder.textView.setText(items.get(position).getEn()); 
       break; 
      case 1: 
       viewHolder.textView.setText(items.get(position).getGe()); 
       break; 
      case 2: 
       viewHolder.textView.setText(items.get(position).getRu()); 
     } 

     return convertView; 
    } 

    static class ViewHolder { 
     public TextView textView; 
    } 

} 
+0

Вставить logcat, с помощью которого приложение ошибки разбилось в адаптере? –

+0

E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at android.widget.ArrayAdapter.init (ArrayAdapter.java:310) в android.widget.ArrayAdapter. (ArrayAdapter.java:153) в ge.mobility.anako.parser.NamesAdapter. (NamesAdapter.java:33)at ge.mobility.anako.parser.TabFragment $ MyTask.onPostExecute (TabFragment.java:111) в файле ge.mobility.anako.parser.TabFragment $ MyTask.onPostExecute (TabFragment.java:62) –

+0

@AnaKoridze Смотрите мой обновленный ответ ... Надеюсь, он вам поможет. –

ответ

0

Попробуйте это:

Изменение MyTask.class следующим образом:

В doInBackground() заменить

namesList.add (имена);

с

publishProgress (имена);

И переопределить этот метод

@Override 
protected void onProgressUpdate(String... values) 
{ 
    super.onProgressUpdate(values); 
    namesList.add(values[0]) 
} 

так, как вы создаете адаптер не является правильным. См. Это:

public class TabFragment extends Fragment { 

    private static final String TAG = "TabFragment"; 
    private static final String PAGE_NO = "page_no"; 
    int page; 
    private ArrayList<Names> namesList; 
    NamesAdapter adapter; 
    ListView listView; 


    public TabFragment() { 
     // Required empty public constructor 
    } 

    public static TabFragment newInstance(int page) { 
     TabFragment fragment = new TabFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(PAGE_NO, page); 
     fragment .setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     namesList = new ArrayList<>(); 
     listView = (ListView) getActivity().findViewById(R.id.listView); 
     // Inflate the layout for this fragment 

     page = getArguments().getInt(PAGE_NO); 
     adapter = new NamesAdapter(getContext(), R.layout.list_item, namesList, page); 
     Log.e(TAG, String.valueOf(page)); 

     listView = (ListView) getActivity().findViewById(R.id.listView); 
     listView.setAdapter(adapter); 

     return inflater.inflate(R.layout.fragment_tab, container, false); 


    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
    { 
     super.onViewCreated(view, savedInstanceState); 

     // Start the task when view is created. 
     new MyTask().execute(); 
    } 


    private class MyTask extends AsyncTask<String, String, Boolean> { 


     @Override 
     protected Boolean doInBackground(String... params) { 

      String content = HttpManager.getData("http://union.ge/catalog/1455299520.json"); 

      Log.e("doInBackground", "was called"); 
      //return content; 

      try { 
       JSONArray json= new JSONArray(content); 

       // get json objects one by one 

       for (int i = 0; i < json.length(); i++){ 

        Names names = new Names(); 
        // this json object now has key-value pairs and 
        JSONObject jRealObject = json.getJSONObject(i).getJSONObject("name"); 
        //Log.e("jrealobject", jRealObject.toString()); 

        names.setEn(jRealObject.getString("en")); 
        names.setGe(jRealObject.getString("ge")); 
        names.setRu(jRealObject.getString("ru")); 

        //migebuli monacemebi shevinaxot chvens array-shi 
        publishProgress(names); 

       } 

       return true; 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return false; 

     } 

     @Override 
     protected void onProgressUpdate(String... values) 
     { 
      super.onProgressUpdate(values); 

      namesList.add(values[0]); 
      adapter.notifyDataSetChanged(); 
     } 


      // on postExecute method runs on the UI thread 
      protected void onPostExecute(Boolean b) { 
       super.onPostExecute(b); 

       if(!b){ 
        Toast.makeText(getActivity(), "data was not parsed", Toast.LENGTH_SHORT).show(); 
       } 
      } 
    } 


} 
+0

он делает то же самое, я имею в виду, когда я нажимаю первую вкладку, иногда она показывает элементы второй вкладки, иногда третьи элементы табуляции, без логики –

+0

Является ли «NullPointerException», с которым вы сталкивались раньше, появляется ли оно сейчас? –

+0

И я не понимаю, где и зачем использовать переменную 'page'. –

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