Create a Generic Base Adapter?

前端 未结 4 1686
粉色の甜心
粉色の甜心 2020-12-01 16:45

I am interested in creating a generic BaseAdapter which will apply to any ListView having any list_item . And it will set the item_row for the list_view.

            


        
相关标签:
4条回答
  • 2020-12-01 17:27
    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));
        }
    
    }
    

    and you can use it like

    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;
                }
            });
    
    0 讨论(0)
  • 2020-12-01 17:32

    I have created a generic adapter, the aar and the sources are at this url:

    it's easy usage:

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

    see Url link more details

    0 讨论(0)
  • 2020-12-01 17:32
    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);
        }
    
    }
    

    model:

    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;
        }
    
    }
    

    adapter:

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-01 17:38

    Answering my own Question after two years.

    In order to make Generic Adapter you need abstract methods in parent class which should be implemented by child. So GenericAdapter must be Abstract and create abstract methods for data you want to change.

    I have different types of ArrayList to show in Adapter only it's model class is different. So I decided to write a genericAdapter. This is for recyclerview if someOne interested for listview. Let me know.

    GenericAdapter

    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);
        }
    }
    

    And I use it like

         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

    0 讨论(0)
提交回复
热议问题