在ListView中使用BaseAdapter进行适配

首先我不否认,我们可以不使用Adapter甚至是BaseAdapter来进行适配就能达到某种效果。

但是,我们的LisView的Item多了之后,可能就会导致有很多冗余。而且,你有没有想过一个问题,如果我们要对某一项进行某种操作,比如说是点击操作。这样一来,势必会很麻烦。所以,我们可以尝试另一种比较好的方式,那就是使用Adapter来适配。在所有的Adapter中,个人还是比较中意BaseAdapter,它不像ListAdapter这些Adapter这么局限。好了,下面我们就来说说这个BaseAdapter吧。

它有一个getCount()的抽象方法,这个方法是说明当前的BaseAdapter需要加载多少项数据。

@Override
    public int getCount() {
    	if (mModels != null) {
			return mModels.size();
		}
        return 0;
    }
上面的代码中,mModels的定义如下:

private ArrayList<EyeWebSiteModel> mModels;
所以,上面我们重写的getCount()方法就是mModels的大小,因为我们要适配每一个EyeWebsiteModel。

getItem(int position)和getItemId(int position)就没什么好说的了,重点是getView(int position, View view, ViewGroup parent)这个方法。
顾名思义,getView就是获得一个View,它要是一个View,这个View会从方法的第二个参数传入,然后我们在方法里面,对这个View进行我们需要的操作,例如,重命名什么的。因为View都拿到了,爱怎么操作还是按自己想着的来?

我现在在这里介绍在Adapter中一种比较常见的方法,那就是在我们View还没有加载的时候才加载,如果已经加载过了,那就去获得这个View。

大家可以看看下面这几行代码:

private class ViewHolder {
        public TextView mSerialTextView = null;
        public TextView mWebSiteTextView = null;
        
        public ViewHolder(View v) {
            mSerialTextView = (TextView) v.findViewById(R.id.fragment_eye_data_select_list_item_serial_textview);
            mWebSiteTextView = (TextView) v.findViewById(R.id.fragment_eye_data_select_list_item_website_textview);
        }
    }
这里,这个ViewHolder类就起到了一个缓冲的作用。我们在getView()方法中其实就是对这个ViewHolder类进行操作。如下:

@Override
    public View getView(int position, View view, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (view == null || view.getTag() == null) {
            view = mLayoutInflater.inflate(R.layout.fragment_eye_data_select_list_item_layout, null);
            viewHolder = new ViewHolder(view);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }
        EyeWebSiteModel model = mModels.get(position);
        viewHolder.mSerialTextView.setText("" + (position + 1));
        viewHolder.mWebSiteTextView.setText(model.getmWebsite());
        
        return view;
    }
而在Fragment或是Activity中适配的过程也很简单:

ListView selectListView = (ListView) v.findViewById(R.id.fragment_eye_data_select_listview);
        final ArrayList<EyeWebSiteModel> models = EyeSelectDataListFragmentMBLL.getMergeWebSiteModelsAll(getActivity());
        if (models == null) {
            return v;
        }
        EyeSelectDataListFragmentAdapter adapter = new EyeSelectDataListFragmentAdapter(getActivity(), models);
        selectListView.setAdapter(adapter);

具体的实现过程(EyeSelectDataListFragment.java和EyeSelectDataListFragmentAdapter.java),可以参考:点击打开链接


原文地址:https://www.cnblogs.com/fengju/p/6336151.html