【问题标题】:Create a Generic Base Adapter?创建通用基本适配器?
【发布时间】:2014-08-25 15:53:41
【问题描述】:

我有兴趣创建一个通用的 BaseAdapter ,它将应用于具有任何 list_item 的任何 ListView 。它会为 list_view 设置 item_row。

    public class GenericAdapter extends BaseAdapter
    {

    Context context;

    ArrayList<HashMap<String, String>> list;

    LayoutInflater inflater;

    public GenericAdapter (Context context, ArrayList<HashMap<String, String>> list) 
        {
            this.context = context;

            this.list = list;

            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

        @Override
        public int getCount()
        {
            return list.size();
        }

        @Override
        public Object getItem(int position)
        {   
            return list.get(position);
        }

        @Override
        public long getItemId(int position)
        {   
            return position;
        }

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

          if(view == null)
           {
            view = inflater.inflate(R.layout.item_of_any_list, parent, false);

// i have to do something here like there may be a method which must be call 

           }

            /*HashMap<String, String> map = list.get(position);

            TextView textViewName = (TextView) view.findViewById(R.id.name);

            TextView textViewDate = (TextView) view.findViewById(R.id.date);

            //TextView textViewDesc = (TextView) view.findViewById(R.id.desc);

            textViewName.setText(map.get("name"));

            textViewDate.setText(map.get("date"));

            //textViewDesc.setText(map.get("description"));
    */      
            return view;
        }

我认为我必须创建一个接口,用于获取和设置单个项目的 item_row。但我不知道这是否可能。有人可以告诉我如何实现它。

我的想法是创建一个接口,然后 GenericAdapter 实现该接口。在该界面中,有一个获取和设置 item_row 的方法。任何扩展 GenericAdapter 的类都必须实现该方法。它将帮助我们制作通用适配器。

当我们扩展该适配器时,我们不需要编写所有代码,例如 getCount、getItem、getItemId,我们只需要重写一个用于 inflateLayout 的函数。必须在 getView 中

提前致谢

【问题讨论】:

标签: android baseadapter layout-inflater


【解决方案1】:

两年后回答我自己的问题。

为了制作通用适配器,您需要parent class 中的abstract 方法,这些方法应该由child 实现。所以GenericAdapter 必须是Abstract 并为要更改的数据创建abstract 方法。

我有不同类型的 ArrayList 要在适配器中显示,只有 model class 不同。所以我决定写一个genericAdapter。这是针对recyclerview 如果 someOne interested 用于列表视图。告诉我。

通用适配器

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private ArrayList<T> items;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public GenericAdapter(Context context, ArrayList<T> items){
        this.context = context;
        this.items = items;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = setViewHolder(parent);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        onBindData(holder,items.get(position));
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    public void addItems( ArrayList<T> savedCardItemz){
        items = savedCardItemz;
        this.notifyDataSetChanged();
    }

    public T getItem(int position){
        return items.get(position);
    }
}

我喜欢使用它

     adapter = new GenericAdapter<DataModel>(context,modelList) {
        @Override
        public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) {
            final View view =            LayoutInflater.from(context).inflate(R.layout.item_view_holder, parent, false);
            ItemViewHolder viewHolder = new ItemViewHolder(context, view);
            return viewHolder;
        }

        @Override
        public void onBindData(RecyclerView.ViewHolder holder1, DataModel val) {
                DataModel userModel = val;

                ItemViewHolder holder = (ItemViewHolder)holder1;
                holder.name.setText(userModel.getName());
                holder.fatherName.setText(userModel.getFatherName());
        }
    };
    mRecyclerView.setAdapter(adapter);

RecyclerView with Search sort functionality

【讨论】:

  • @Nepster 您的代码不适用于多种类型的适配器。实际上,我可以看到它不够“通用”。您的抽象方法只不过是 RecycleView Adapter 的包装器方法(setViewHolderonCreateViewHolder 的包装器,onBindDataonBindViewHolder 的包装器)此模式适用于 Adapter ListView 而不是 Recycle Adapter。只是我的
  • @R4j 提出改进建议。以及如何根据类型实现泛型过滤器
【解决方案2】:

我创建了一个通用适配器,aar 和源位于this url

使用简单:

RecyclerAdapter<Customer> mAdapter = new RecyclerAdapter(customerList, CustomerViewHolder.class);

查看网址链接了解更多详情

【讨论】:

    【解决方案3】:
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    
    import java.util.List;
    
    public abstract class GenericAdapter<T> extends BaseAdapter {
        LayoutInflater layoutInflater;
        Context context;
        private List<T> tList;
    
    
    
    public GenericAdapter(Context context, List<T> tList) {
            this.context = context;
            this.tList = tList;
            layoutInflater = LayoutInflater.from(context);
        }
    
        @Override
        public int getCount() {
            if (tList == null)
                return 0;
            return tList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return tList.get(position);
        }
    
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        public abstract View getMyView(int position, View convertView, ViewGroup parent,T t);
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return getMyView(position, convertView, parent,tList.get(position));
        }
    
    }
    

    你可以像这样使用它

    spnDistrict.setAdapter(new GenericAdapter<Institutions>(getContext(), institutionsList) {
                @Override
                public View getMyView(int position, View convertView, ViewGroup parent, Institutions institutions) {
                    TextView textView = (TextView) convertView;
                    if (textView == null) {
                        textView = (TextView) getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null);
                        textView.setTextColor(getContext().getResources().getColor(R.color.black));
                    }
                    textView.setText(institutions.getName());
                    return textView;
                }
            });
    

    【讨论】:

    • 虽然这可能会回答这个问题,但最好解释一下答案的基本部分,以及 OPs 代码可能存在什么问题。
    【解决方案4】:
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.app.Fragment;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.AdapterView.OnItemClickListener;
    
    import com.accel.cloudRDB.model.OpenTask;
    
    public class Open_task_fragment extends Fragment {
        View view;
        ListView mListView;
        Open_task_adapter open_task_adapter;
        Context mContext;
        ArrayList<OpenTask> items;
        Button main_menu;
        @Override
        public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
        {
    
            mContext=getActivity();
            view=inflater.inflate(R.layout.open_task_layout, container,false);
            items=new ArrayList<OpenTask>();
            initXML();
            OpenTask open=new OpenTask();
             open.setDate("10/10/2014");
             open.setTime("12:00 pm");
             open.setAddress("chennai Dlf,Accel@123");
             open.setStatus("Deliver ABC");
             OpenTask open1=new OpenTask();
             open1.setDate("10/10/2014");
             open1.setTime("12:00 pm");
             open1.setAddress("chennai Dlf,Accel@123");
             open1.setStatus("Deliver ABC2");
             items.add(open);
             items.add(open1);
             open_task_adapter=new Open_task_adapter(mContext,items);
    //      open_task_adapter=new Open_task_adapter(mContext,items);
            mListView.setAdapter(open_task_adapter);
            mListView.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View arg1, int position,
                        long arg3) {
    
                        Intent intent=new Intent(mContext,Task_detail_activity.class);
                        ((Activity)mContext).startActivity(intent);
                }
    
            });
            return view;
        }
        public void initXML()
        {
            mListView=(ListView)view.findViewById(R.id.listView1);
            main_menu=(Button)view.findViewById(R.id.main_menu);
        }
    
    }
    

    型号:

    public class OpenTask {
    
        String Date,Time,Address,Status;
    
        public String getDate() {
            return Date;
        }
    
        public void setDate(String date) {
            Date = date;
        }
    
        public String getTime() {
            return Time;
        }
    
        public void setTime(String time) {
            Time = time;
        }
    
        public String getAddress() {
            return Address;
        }
    
        public void setAddress(String address) {
            Address = address;
        }
    
        public String getStatus() {
            return Status;
        }
    
        public void setStatus(String status) {
            Status = status;
        }
    
    }
    

    适配器:

    import java.util.ArrayList;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    
    public class Open_task_adapter extends BaseAdapter {
    
        Context context;
    
        ArrayList<OpenTask> list;
    
        public Open_task_adapter(Context context,ArrayList<OpenTask> list) {
    
            this.context = context;
            this.list = list;
    
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            OpenTaskHolder hodler;
            LayoutInflater inflater;
            OpenTask open=list.get(position);
            if (convertView == null) 
            {
                inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.open_task_list_item_layout, null);
                hodler = new OpenTaskHolder();
                hodler.date = (TextView)convertView.findViewById(R.id.Date);
                hodler.time = (TextView)convertView.findViewById(R.id.Time);
                hodler.address = (TextView)convertView.findViewById(R.id.Address);
                hodler.status = (TextView)convertView.findViewById(R.id.Status);
    
                convertView.setTag(hodler);
            } else {
                hodler = (OpenTaskHolder)convertView.getTag();
            }
    
            hodler.date.setText(open.getDate());
            hodler.time.setText(open.getTime());
            hodler.address.setText(open.getAddress());
            hodler.status.setText(open.getStatus());
    
            return convertView;
        }
    
        class OpenTaskHolder {
            TextView date,time,address,status;
        }
    }
    

    【讨论】:

    • 请解释这是如何回答问题的。
    • @CommonsWare 我们可以通过这种方式实现
    • 懒惰的胆小鬼,反对的选民发表评论我从这里做错了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多