2014-07-04 12 views
5

Sono interessato a creare un BaseAdapter generico che si applicherà a qualsiasi ListView con qualsiasi list_item. E imposterà item_row per la lista_vista.Creare un adattatore base generico?

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

Penso di dover creare un'interfaccia che ottenga e imposti il ​​item_row per il singolo oggetto. Ma non lo so, potrebbe essere possibile. Qualcuno può dirmi come posso raggiungerlo.

La mia idea è creare un'interfaccia e GenericAdapter implementa tale interfaccia. In quell'interfaccia c'è un metodo per ottenere e impostare item_row. Qualsiasi classe che estende GenericAdapter deve implementare tale metodo. ci aiuterà a creare un adattatore generico.

Quando estendiamo quell'adattatore non è necessario scrivere tutto il codice come getCount, getItem, getItemId, dobbiamo solo sovrascrivere una funzione che è quella di inflateLayout. che deve essere all'interno GetView

Grazie in anticipo

+2

Se non si desidera scrivere adattatori personalizzati, considerare l'utilizzo di una libreria esistente, come https://github.com/ribot/easy-adapter o http://amigold.github.io/FunDapter/ – CommonsWare

+0

Vedi questo [Adattatore generico] (https://github.com/sa jadshokri/Core-Adapter) – FarshidABZ

risposta

3

Rispondendo alla mia domanda dopo due anni.

Al fine di rendere adattatore generico è necessario abstract metodi in parent class che dovrebbero essere attuate da child. Pertanto, GenericAdapter deve essere Abstract e creare i metodi abstract per i dati che si desidera modificare.

Ho diversi tipi di ArrayList per mostrare in Adattatore solo è model class è diverso. Così ho deciso di scrivere un genericAdapter. Questo è per recyclerview se someOne interested per listview. Fammi sapere.

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

e lo uso come

 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

Puoi mostrare il tuo adattatore per Listview –

+0

@Nepster il tuo codice ** non funziona per più tipi di adattatore **. In realtà, posso vedere che non è abbastanza 'generico'. I tuoi metodi astratti non sono altro che i metodi wrapper di RecycleView Adapter ('setViewHolder' è un wrapper di' onCreateViewHolder', 'onBindData' è wrapping per' onBindViewHolder') Questo pattern funzionerà con Adapter ListView invece di Recycle Adapter. Solo per me – R4j

+0

@ R4j Dai il suggerimento per migliorarlo. E come posso implementare un filtro generico sulla base del tipo – 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); 
    } 

} 

modello:

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

} 

adattatore:

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

Si prega di spiegare come questo risponde alla domanda. – CommonsWare

+0

@CommonsWare possiamo ottenere in questo modo – Boopathi

+0

vigliacchi pigri, in basso elettore dare un commento che cosa ho sbagliato da qui? – Boopathi

1

ho creato un adattatore generica, la relazione annuale di attività e le fonti sono a this url:

è facile utilizzo:

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

vedi link URL maggiori dettagli

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

} 

ed è possibile utilizzarlo come

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

Mentre questo può rispondere al domanda, è meglio spiegare le parti essenziali della risposta e possibilmente quale fosse il problema con il codice OPs. – pirho