2014-07-04 7 views
5

मुझे एक सामान्य बेस एडाप्टर बनाने में दिलचस्पी है जो किसी भी listVit में किसी भी list_item पर लागू होगी। और यह 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 को प्राप्त करने और सेट करने का एक तरीका है। जेनेरिक एडाप्टर को विस्तारित करने वाली कोई भी कक्षा उस विधि को लागू करनी चाहिए। यह हमें एक सामान्य एडाप्टर बनाने में मदद करेगा।

जब हम उस एडाप्टर को बढ़ाते हैं तो हमें getCount, getItem, getItemId जैसे सभी कोड लिखने की आवश्यकता नहीं है, हमें केवल एक फ़ंक्शन को ओवरराइड करना है जो फ़्लोट करने के लिए है। जो getView

अंदर

अग्रिम धन्यवाद होना चाहिए

+2

उपयोग कर सकते हैं यदि आप नहीं चाहते हैं कस्टम एडेप्टर लिखने के लिए, प्रयोग करने पर विचार एक मौजूदा लाइब्रेरी, जैसे https://github.com/ribot/easy-adapter या http://amigold.github.io/FunDapter/ – CommonsWare

+0

यह देखें [जेनेरिक एडाप्टर] (https://github.com/sa जादशोक्री/कोर-एडाप्टर) – FarshidABZ

उत्तर

3

दो साल के बाद मेरे अपने प्रश्न का उत्तर देना।

आदेश जेनेरिक एडाप्टर आप parent class में abstract तरीकों जो child से लागू किया जाना चाहिए की जरूरत बनाने के लिए। तो GenericAdapterAbstract होना चाहिए और उस डेटा के लिए abstract विधियां बनाएं जिन्हें आप बदलना चाहते हैं।

मैं केवल यह model class भिन्न है एडाप्टर में दिखाने के लिए ArrayList के विभिन्न प्रकार की है। तो मैंने genericAdapter लिखने का फैसला किया। यह सूची दृश्य के लिए recyclerview के लिए है यदि कुछ interested। मुझे बताएं।

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

और मैं यह

 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

नहीं है क्या आप अपना एडाप्टर सूचीदृश्य –

+0

@Nepster के लिए अपना कोड दिखा सकते हैं ** एकाधिक प्रकार एडाप्टर ** के लिए काम नहीं करता है। असल में, मैं देख सकता हूं कि यह पर्याप्त 'जेनेरिक' नहीं है। आपकी सार पद्धतियां रीसायकल व्यू एडाप्टर से रैपर विधियों से कुछ भी नहीं हैं ('setViewHolder'' क्रिएटिव्यूहोल्डर 'पर एक रैपर है,' ऑनबिंडडाटा' 'ऑनबिंडव्यूहोल्डर' के लिए लपेट रहा है) यह पैटर्न रीसायकल एडाप्टर के बजाय एडाप्टर सूची दृश्य के लिए काम करेगा। बस मेरा – R4j

+0

@ आर 4 जे इसे सुधारने के लिए सुझाव दें। और मैं – 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); 
    } 

} 

मॉडल:

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

कृपया बताएं कि यह प्रश्न का उत्तर कैसे देता है। – CommonsWare

+0

@ कॉमन्सवेयर हम इस तरह से – Boopathi

+0

आलसी डरपोक से पीड़ित हो सकते हैं, नीचे मतदाता टिप्पणी देते हैं कि मैंने यहां से क्या गलत किया? – Boopathi

1

मैं एक सामान्य एडाप्टर, आर और सूत्रों बनाया है की तरह का उपयोग this url पर कर रहे हैं:

यह आसान उपयोग है:

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

यूआरएल लिंक अधिक जानकारी के

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

} 

देख सकते हैं और आप की तरह

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

सहायता कर सकता है, हालांकि यह उत्तर दे सकता है प्रश्न, उत्तर के आवश्यक हिस्सों को समझाना बेहतर है और संभवतः ओपीएस कोड के साथ समस्या क्या थी। – pirho

संबंधित मुद्दे