2016-11-16 5 views
0

Je suis un débutant qui fait suite à un androïde book.now j'ai une application de test de problème.Le est une application de nouvelles et ont un code comme ceci:Comment puis-je changer le code android pour le faire fonctionner à nouveau?

public class NewsTitleFragment extends Fragment implements OnItemClickListener { 
    private ListView newsTitleListView; 
    private List<News> newsList; 
    private NewsAdapter adapter; 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     newsList = getNews(); 
     adapter = new NewsAdapter((Activity)activity, R.layout.news_item, newsList); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View view = inflater 
      .inflate(R.layout.news_title_frag, container, false); 
     newsTitleListView = (ListView) view 
      .findViewById(R.id.news_title_list_view); 
     newsTitleListView.setAdapter(adapter); 
     newsTitleListView.setOnItemClickListener(this); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (getActivity().findViewById(R.id.news_content_layout) != null) { 
      isTwoPane = true; 
     } else { 
      isTwoPane = false; 
     } 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) { 
     News news = newsList.get(position); 
     if (isTwoPane) { 
      NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager() 
       .findFragmentById(R.id.news_content_fragment); 
      newsContentFragment.refresh(news.getTitle(), news.getContent()); 
     } else { 
      NewsContentActivity.actionStart(getActivity(), news.getTitle(), 
       news.getContent()); 
     } 
    } 

    private List<News> getNews() { 
     List<News> newsList = new ArrayList<News>(); 
     News news1 = new News(); 
     news1.setTitle("It's news 1"); 
     news1.setContent("It's news 1 content"); 
     newsList.add(news1); 
     News news2 = new News(); 
     news2.setTitle("It's news 2"); 
     news2.setContent("It's news 2 content"); 
     newsList.add(news2); 
     return newsList; 
    } 

} 

mais dans la nouvelle API Android, le code

public void onAttach(Activity activity) 

doit changer pour

public void onAttach(Context context) 

je change, mais l'application montre quoi que ce soit après le changement! Je veux savoir pourquoi je me trompe et comment le modifier. Merci beaucoup. PSThe classe NewsAdapter étend ArrayAdapter.The classe Nouvelles n'a que deux cordes La méthode NewsAdapter est:

public class NewsAdapter extends ArrayAdapter<News> { 

    private int resourceId; 

    public NewsAdapter(Context context, int textViewResourceId, List<News> objects) { 
     super(context, textViewResourceId, objects); 
     resourceId = textViewResourceId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     News news = getItem(position); 
     View view; 
     if (convertView == null) { 
      view = LayoutInflater.from(getContext()).inflate(resourceId, null); 
     } else { 
      view = convertView; 
} 
    TextView newsTitleText = (TextView) view.findViewById(R.id.news_title); 
newsTitleText.setText(news.getTitle()); 
     return view; 
     } 

} 
+1

Votre fragment n'a pas de méthode onCreateView. Donc il est vide –

+0

Il a déjà une méthode onCreateView.before le changement de l'application montre la liste des nouvelles, mais quand je le change en "Contexte" les applications ne montre rien – cramile

+0

Nous aimerions que vous montriez un [mcve], afin que nous puissions vérifier la problème. En d'autres termes, s'il vous plaît [edit] pour montrer cette méthode –

Répondre

0

Mettre cela dans onCreateView

newsList = new ArrayList<News>(); 
adapter = new NewsAdapter(getActivity(), R.layout.news_item, newsList); 
newsTitleListView.setAdapter(adapter); 

Au lieu de newsList = getNews(), utilisez

adapter.clear(); // or newsList.clear(); 
adapter.addAll(getNews()); // or newsList.addAll(); 
/** ... but, if using alternatives **/ 
// adapter.notifyDataSetChanged(); // this is needed if not using adapter methods directly 

Ou, ré-écrire getNews() ajouter directement à l'adaptateur.

Ensuite, ne réattribuez pas le adapter ou newsList en dehors de onCreateView car il n'est pas nécessaire.

+0

Pouvez-vous me dire pourquoi je devrais utiliser 'adapter.clear(); adapter.addAll (getNews()); 'mais pas' newsList = getNews() '? à cause de la spécification du code? – cramile

+0

Parce que lorsque vous utilisez 'newsList = getNews()', vous "détachez" la référence de la liste sur laquelle l'adaptateur est conservé. –

+0

Je l'ai eu, merci. – cramile

0

S'il vous plaît vérifier le Fragment Android Documentation https://developer.android.com/reference/android/app/Fragment.html

Comme cricket_007 déjà mentionné, vous devez définir ou créer la disposition dans la méthode onCreateView et le renvoyer.

Exemple de la documentation Fragment:

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

    ScrollView scroller = new ScrollView(getActivity()); 
    TextView text = new TextView(getActivity()); 
    int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      4, getActivity().getResources().getDisplayMetrics()); 
    text.setPadding(padding, padding, padding, padding); 
    scroller.addView(text); 
    text.setText(Shakespeare.DIALOGUE[getShownIndex()]); 
    return scroller; 
} 

Ou si vous avez déjà une mise en page XML, vous pouvez simplement les gonfler dans la méthode onCreateView:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View view = (LinearLayout) inflater.inflate(R.layout.fragment_layout, container, false); 
     return view; 
} 
+0

J'ai la méthode XML et onCreateView, et avant de le changer en "Contexte" l'application fonctionne bien. Après le changement, il ne montre rien – cramile