美文网首页
【Android】在Fragment中使用ListView

【Android】在Fragment中使用ListView

作者: 感同身受_ | 来源:发表于2019-07-30 19:21 被阅读0次

    今天遇到在搬之前代码的时候,需要将我写在一个活动中的ListView写到Fragment中,但是,在我要搬完的时候,我的LayoutInflater出问题了,

    一、自己所遇到的问题的分析过程

    因为自己刚开始用的自定义Adapter,所以建了一个类去继承BaseAdAapter,并重写了四个方法,其中getView中的代码

    @Override
            public View getView(int position, View convertView, ViewGroup viewGroup) {
                Holder holder;
                if(convertView == null){
                    Log.d("Flag","getView11");
                    convertView = LayoutInflater.from(SecondActivity.this).inflate(R.layout.my_adapter_item,null);
                    holder = new Holder();
                    holder.image = convertView.findViewById(R.id.image);
                    holder.name = convertView.findViewById(R.id.name);
                    holder.next = convertView.findViewById(R.id.next);
                    convertView.setTag(holder);
                }else{
                    holder = (Holder) convertView.getTag();
                }
    
                holder.image.setImageResource((Integer) list.get(position).get("img"));
                holder.name.setText((String) list.get(position).get("name"));
                holder.next.setImageResource((Integer) list.get(position).get("next"));
                Log.d("Flag","getView over");
                return convertView;
            }
        }
    
        class Holder{
            private ImageView image;
            private TextView name;
            private ImageView next;
        }
    

    convertView = LayoutInflater.from(SecondActivity.this).inflate(R.layout.my_adapter_item,null);
    就是这句,先说LayoutInflater.from(SecondActivity.this)这个方法,

    1. from接收的参数是一个Context,不能放Fragment
    2. 这个方法返回值是一个inflater
      后面的.inflate(R.layout.my_adapter_item,null),接收的是你要映射的布局,和一个root,
      刚开始我想通过在Fragment中
     @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_mine,container,false);
            //list为保存数据的列表
            MyAdapter adapter = new MyAdapter(list,inflater);
            //   MyAdapter adapter = new MyAdapter(list,inflater);
            return inflater.inflate(R.layout.fragment_mine,container,false);
        }
    

    MyAdapter adapter = new MyAdapter(list,inflater);通过构造方法将inflater传进去直接调用.inflate(R.layout.my_adapter_item,null),但是运行后,并没有想要的结果
    或者是用MyAdapter adapter = new MyAdapter(list,getActivity());将Context传过去,但是发现结果都一样,都是下面的问题:
    后面debug发现是因为Fragment中的onCreateView方法中的参数@NonNull LayoutInflater inflater,是MainActivity中的inflater,但是我想要的是Fragment的inflater,所以结果不理想

    二、解决办法

    后面百度了“在Fragment中使用ListView”,才解决了我的问题

    1. 首先,你的ListView控件的id必须为android:id="@android:id/list",在网上也看到过说android:id="@id/android:list"这样的写法,但是我一写就报错
    2. 让你的Fragment继承ListFragment,这样你就能在你的Fragment中使用
      setListAdapter(adapter);方法,
    3. 将你的适配器改用 SimpleAdapter
            //参数一:上下文对象  参数二:数据源List<Map<String,Object>> 参数三:item对应的布局文件
            //参数四:表示由map中定义的key组成的字符串类型的数字  参数五:需要显示的控件id组成的的数组
            //保证参数四和参数五一一对应,否则控件属性会对换(张冠李戴)
            adapter = new SimpleAdapter(getActivity(), getData(images, names),
                    R.layout.setting_adapter_item, new String[] { "img", "name","next" },
                    new int[] { R.id.image, R.id.name,R.id.next });
    

    三、最终代码:

    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.ListFragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.Toast;
    
    import com.example.familyeducationhelp.R;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class mine extends ListFragment {
    
        private ListView lv;
        private SimpleAdapter adapter;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //图片
            int[] images = {R.drawable.news,R.drawable.record,R.drawable.setting};
            //内容
            String[] names = {"消息中心","家教记录","设置"};
            //参数一:上下文对象  参数二:数据源List<Map<String,Object>> 参数三:item对应的布局文件
            //参数四:表示由map中定义的key组成的字符串类型的数字  参数五:需要显示的控件id组成的的数组
            //保证参数四和参数五一一对应,否则控件属性会对换(张冠李戴)
            adapter = new SimpleAdapter(getActivity(), getData(images, names),
                    R.layout.setting_adapter_item, new String[] { "img", "name","next" },
                    new int[] { R.id.image, R.id.name,R.id.next });
            //继承了ListFragment后的方法
            setListAdapter(adapter);
    
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_mine,container,false);
            lv = view.findViewById(android.R.id.list);
            return inflater.inflate(R.layout.fragment_mine,container,false);
        }
    
        //监听点击事件
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            if(position == 0){
                Toast.makeText(getActivity(),"你点击了 消息中心",Toast.LENGTH_LONG).show();
            }else if(position == 1){
                Toast.makeText(getActivity(),"你点击了  家教记录",Toast.LENGTH_LONG).show();
            }else if(position == 2){
                Toast.makeText(getActivity(),"你点击了  设置",Toast.LENGTH_LONG).show();
            }
            super.onListItemClick(l, v, position, id);
        }
    
    
        //对数据进行加载
        private List<? extends Map<String, ?>> getData(int[] images, String[] names) {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < images.length; i++) {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("img", images[i]);
                map.put("name", names[i]);
                map.put("next",R.drawable.next);
                list.add(map);
            }
    
            return list;
        }
    }
    
    

    布局中的代码:

    <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toTopOf="@+id/guideline_Listview"
            app:layout_constraintTop_toTopOf="@+id/guideline_Listview_Top"
            tools:layout_editor_absoluteX="0dp"/>
    

    相关文章

      网友评论

          本文标题:【Android】在Fragment中使用ListView

          本文链接:https://www.haomeiwen.com/subject/hikorctx.html