2014-07-04 43 views
5

Jestem zainteresowany tworzeniem ogólnego BaseAdaptera, który będzie miał zastosowanie do dowolnego ListView posiadającego dowolną list_item. I ustawi item_row dla widoku listy.Utwórz ogólną kartę bazową?

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

Myślę, że muszę stworzyć interfejs, który pobiera i ustawia item_row dla pojedynczego przedmiotu. Ale nie wiem, czy to możliwe. Czy ktoś może mi powiedzieć, jak mogę to osiągnąć?

Mój pomysł polega na stworzeniu interfejsu, a GenericAdapter zaimplementuje ten interfejs. W tym interfejsie istnieje metoda pobierania i ustawiania item_row. Każda klasa, która rozszerza GenericAdapter, musi implementować tę metodę. to pomoże nam stworzyć ogólny adapter.

Po rozszerzeniu tego adaptera nie musimy pisać całego kodu, takiego jak getCount, getItem, getItemId, musimy po prostu zastąpić funkcję, która ma na celu nadmuchanieLayout. które muszą być wewnątrz getView

Dzięki z góry

+2

Jeśli nie chcesz pisać własnych adapterów, należy rozważyć użycie istniejąca biblioteka, taka jak https://github.com/ribot/easy-adapter lub http://amigold.github.io/FunDapter/ – CommonsWare

+0

Zobacz [Generic Adapter] (https://github.com/sa jadshokri/Core-Adapter) – FarshidABZ

Odpowiedz

3

Odpowiadając na moje własne pytanie po dwóch latach.

Aby Generic Adapter trzeba abstract metod w parent class które powinny być realizowane przez child. Tak więc GenericAdapter musi być Abstract i tworzyć metody dla danych, które chcesz zmienić.

Mam różne typy ArrayList, aby pokazać tylko w adapterze model class jest inny. Więc postanowiłem napisać genericAdapter. Jest to dla recyclerview, jeśli dlaOd listy interested. Daj mi znać.

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

i używam go jak

 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

+1

Możesz pokazać swój adapter dla Listview –

+0

@Napotuj swój kod ** nie działa dla adaptera wielorakiego **. Właściwie to widzę, że nie wystarczy "generyczny". Twoje abstrakcyjne metody są niczym więcej niż metodami otokowymi z Adaptera RecycleView ('setViewHolder' jest opakowaniem' onCreateViewHolder', 'onBindData' jest zawijaniem dla' onBindViewHolder') Ten wzorzec będzie działać dla Adapter ListView zamiast z Recycle Adapter. Just my though – R4j

+0

@ R4j Podaj sugestię, aby ją poprawić. I jak mogę zaimplementować filtr generyczny na podstawie typu – Nepster

-1
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,[email protected]"); 
     open.setStatus("Deliver ABC"); 
     OpenTask open1=new OpenTask(); 
     open1.setDate("10/10/2014"); 
     open1.setTime("12:00 pm"); 
     open1.setAddress("chennai Dlf,[email protected]"); 
     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; 
    } 
} 
+7

Proszę wyjaśnić, w jaki sposób to odpowiada na pytanie. – CommonsWare

+0

@ConsonsWare możemy uzyskać w ten sposób – Boopathi

+0

leniwych tchórzy, w dół wyborców dać komentarz, co ja źle tutaj? – Boopathi

1

Stworzyłem rodzajowe adaptera AAR i źródeł są this url:

to łatwe użycie:

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

zobaczyć Url Link Więcej szczegółów

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

} 

i można go używać jak

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

Chociaż może to odpowiedzieć pytanie, lepiej wyjaśnić zasadnicze części odpowiedzi i ewentualnie jaki był problem z kodem PO. – pirho