簡體   English   中英

Android-ListFragment和自定義適配器

[英]Android - ListFragment and Custom Adapter

我是Android開發中的新手。 我在使用ListFragment和自定義適配器時遇到問題。 我的列表未填充任何對象。 你能檢查我的密碼嗎? 如果滾動到底部,您將看到一個對象,但隨后崩潰。

ListFragmen.java

public class Fragment_List extends ListFragment {

    View item_view ;
    private List<News> arNews = new ArrayList<News>();
     Activity activity =    getActivity();
     private ArrayAdapter<News> arrayAdapter;
     private ListView mListView;

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

         arrayAdapter = new MyListAdapter();
     }
     public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

         // Inflate the layout for this fragment
         item_view= inflater.inflate(R.layout.item_view,null);

         View v1=inflater.inflate(R.layout.fragment_list, container, false);
         mListView= (ListView) v1.findViewById(android.R.id.list);

        populateNewsList();

         return v1;
     }


     public Fragment_List() {

    }

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


        mListView.setAdapter(arrayAdapter);

     }



     private void populateNewsList() {

         arNews.add(new News("Ciao",R.drawable.figura_0icona,"uno"));
        arNews.add(new News("pippo",R.drawable.figura_1icona,"due"));
        arNews.add(new News("pluto",R.drawable.figura_2icona,"tre"));
        arNews.add(new News("Ciao",R.drawable.figura_3icona,"quattro"));
        arNews.add(new News("pippo",R.drawable.figura_4icona,"cinque"));
        arNews.add(new News("pluto",R.drawable.figura_5icona,"sei"));
        arNews.add(new News("Ciao",R.drawable.figura_6icona,"sette"));
        arNews.add(new News("pippo",R.drawable.figura_7icona,"otto"));
        arNews.add(new News("pluto",R.drawable.figura_8icona,"nove"));


    // TODO Auto-generated method stub

     }



        private class MyListAdapter extends ArrayAdapter<News>
        {


            public MyListAdapter(){

                super(getActivity(),R.layout.item_view,arNews);
                Toast.makeText(getContext(), "ciao"+arNews.size(), Toast.LENGTH_SHORT).show();
            }

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

                //make sure have a view to work with (may have given null)
                View itemView = convertView;

                if(itemView==null)
                {
                    itemView=item_view;
                    if(itemView==null)
                        Toast.makeText(getContext(), "null", Toast.LENGTH_SHORT).show();
                }

                //find news to work with
                News currentNews = arNews.get(position);



                // fill the view
                ImageView imageView = (ImageView) itemView.findViewById(R.id.news_icon);
                imageView.setImageResource(currentNews.getFotoId());


                //make
                TextView makeText = (TextView) itemView.findViewById(R.id.news_anteprima);
                makeText.setText(currentNews.getAntemprima());

                Toast.makeText(getContext(), "testo"+currentNews.getAntemprima(), Toast.LENGTH_SHORT).show();

                return itemView;
            }



        }
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            // TODO Auto-generated method stub
            News clickedNews = arNews.get(position);
            String message = "You clicked position" + position + " anteprima :" + clickedNews.getAntemprima();

            Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();

            super.onListItemClick(l, v, position, id);
        }



}

fragment_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="600dp"
        android:layout_height="426dp" >
    </ListView>

</LinearLayout>

非常感謝你!

首先,當您使用ListFragment時,需要在布局(fragment_list.xml)上聲明兩個元素:


  1. ID為@android:id / empty的 TextView
    • 當適配器為空時顯示文本時由Android使用


  1. ID為@android:id / list的 ListView
    • 當Adapter完全生成ListView時由android使用

此ID位於android核心中,然后android在其中隱式工作,添加,刷新和刪除元素。

查看您的代碼,您正在為ListView聲明一個對象。 錯了

刪除此對象的聲明。

其次 ,您的適配器。 您是從ArrayList擴展而來的,在構造函數上,需要給定Context資源List來調用超級構造函數。 Android開發人員參考:ArrayAdapter ArrayAdapter(Context context,int resource,T [] objects)默認情況下, int資源為0(零)。

總結

  1. 將兩個ID為ID的內容添加到您的layout.xml中。

    • ID為@android:id / empty的 TextView
    • ID為@android:id / list的 ListView
  2. 在Fragment_List類上,刪除ListView的所有實例。

  3. 在您的Adapter調用超級構造函數上,給定Context,資源,元素List。

  4. 從Fragment_List類調用新的構造函數。 Android開發人員參考:ListFragment 假設你需要調用ListFragment.setListAdapter()反對ListFragment.setAdapter()。

  5. 試用! 我認為那是工作!

希望對您有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM