2012-06-19 14 views
7

मेरे पास ListView में एक सूची TextView प्रति सूची आइटम है। मैंने एक उचित getView विधि लिखने के लिए सीखा है, लेकिन मुझे यकीन नहीं है कि मैं उस विधि को कॉल करने के लिए setAdapter का उपयोग कर रहा हूं।प्रति सूचीदृश्य एकाधिक टेक्स्टव्यू के मामले में एडाप्टर कैसे सेट करें?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/home_root" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <!-- Include Action Bar --> 
    <include layout="@layout/actionbar_layout" /> 

    <ListView 
     android:id="@+id/dashboardList" 
     style="@style/LeftHeaderText" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:background="@drawable/innerdashboard_bg" 
     android:textColor="@color/textColor" > 

     <TextView android:id="@+id/project" /> 

     <TextView android:id="@+id/work_request" /> 

     <TextView android:id="@+id/start_date" /> 

     <TextView android:id="@+id/status" /> 

    </ListView> 

</LinearLayout> 

मैं कुछ तरीके, जिनमें से कोई भी काम की कोशिश की है:

private static String[] project = {"proj1","proj2"}; 
private static String[] workRequests = {"requirement gathering", "design"}; 
private static String[] startDate = {"02/21/2012","07/15/2011"}; 
private static String[] status = {"WIP","DONE"}; 

ListView mListView; 

public class MyDashboardActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mydashboard); 

     final LayoutInflater mInflater = LayoutInflater.from(this); 
     mListView = (ListView)findViewById(R.id.dashboardList); 
     mListView.setAdapter(
       // How do I set the adapter? 
       ); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     System.out.println("enters"); 
     if(convertView == null){ 
      convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); 
     } 

     ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); 
     ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); 
     ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); 
     ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); 

     return convertView; 
    } 

यह XML लेआउट है। क्या कोई सुझाव दे सकता है कि इस मामले में एडाप्टर कैसे सेट करें? धन्यवाद!

+1

इस संपूर्ण उदाहरण को देखें http://android-example-code.blogspot.in/p/dynamic-custoized-list-view-in-android.html – MAC

+0

कुछ कोड गायब है ... कक्षा का विस्तार आधार एडाप्टर कहां है? ?? –

+0

क्या आपके 'एडाप्टर' वर्ग का 'getView()' हिस्सा है? – slybloty

उत्तर

15

आपको अपना एडाप्टर लागू करने की आवश्यकता है। मेरा तरीका एक ऐसी वस्तु को परिभाषित करना है जो एक दृश्य को "प्रतिनिधित्व" करता है।

नीचे, आपकी आवश्यकताओं के अनुरूप दो TextViews के साथ एक बहुत ही सरल उदाहरण है।

वस्तु जो एक दृश्य (ListView में एक पंक्ति) का प्रतिनिधित्व करता है:

public class CustomObject { 

    private String prop1; 
    private String prop2; 

    public CustomObject(String prop1, String prop2) { 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 

    public String getProp1() { 
     return prop1; 
    } 

    public String getProp2() { 
     return prop2; 
    } 
} 

अगला कस्टम अनुकूलक:

public class CustomAdapter extends BaseAdapter { 

    private LayoutInflater inflater; 
    private ArrayList<CustomObject> objects; 

    private class ViewHolder { 
     TextView textView1; 
     TextView textView2; 
    } 

    public CustomAdapter(Context context, ArrayList<CustomObject> objects) { 
     inflater = LayoutInflater.from(context); 
     this.objects = objects; 
    } 

    public int getCount() { 
     return objects.size(); 
    } 

    public CustomObject getItem(int position) { 
     return objects.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     if(convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.your_view_layout, null); 
     holder.textView1 = (TextView) convertView.findViewById(R.id.id_textView1); 
     holder.textView2 = (TextView) convertView.findViewById(R.id.list_id_textView2); 
     convertView.setTag(holder); 
     } else { 
     holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.textView1.setText(objects.get(position).getprop1()); 
     holder.textView2.setText(objects.get(position).getprop2()); 
     return convertView; 
    } 
} 

अब आप को परिभाषित करने और अपनी गतिविधि में अपने एडाप्टर सेट कर सकते हैं:

ArrayList<CustomObject> objects = new ArrayList<CustomObject>(); 
CustomAdapter customAdapter = new CustomAdapter(this, objects); 
listView.setAdapter(customAdapter); 

अब आपको ऑब्जेक्ट सूची में केवल अपने कस्टम ऑब्जेक्ट का प्रबंधन करना होगा। जब आप ListView पर संशोधनों में संशोधन करना चाहते हैं तो customAdapter.notifyDataSetChanged() को न भूलें।

+0

बहुत बहुत धन्यवाद, मैं इसे आजमा रहा हूं। – Harsh

+0

आपका स्वागत है, मैंने अपने चर नामों में कुछ गलतियों को ठीक किया है। – FabiF

+0

तो क्या मुझे हर नए 'ListView' के निर्माण के लिए कस्टम एडेप्टर बनाना है? (जिसमें एकाधिक 'टेक्स्ट व्यू का संभोग है) – Harsh

4

आपके getView() कोड को कक्षा में जाने की आवश्यकता है जो बेसएडाप्टर या इसके उप-वर्गों में से एक को बढ़ाता है।

ऐसा करने का एक तरीका है अपनी MyDashboardActivity के भीतर एक निजी कक्षा बनाना। यहां एक त्वरित उदाहरण दिया गया है (कुछ अतिरिक्त कोड की आवश्यकता होगी)। आप शायद एक कस्टम ऑब्जेक्ट को उन सभी चीजों को जोड़ना चाहेंगे जिन्हें आप एक सूची आइटम में प्रदर्शित करना चाहते हैं। एकाधिक सरणी के बजाय, एक कस्टम प्रकार की एक सरणी है जिसमें आपके द्वारा ट्रैक किए जा रहे प्रत्येक मान के गुण होते हैं।

एक और बात: आपके चार टेक्स्ट व्यू को अपनी लेआउट फ़ाइल में जाना चाहिए (list_item.xml here देखें)। उस आइटम लेआउट फ़ाइल को कस्टम एडाप्टर के कन्स्ट्रक्टर के माध्यम से जोड़ दिया जाता है (मैंने इसे हाइलाइट करने के लिए नीचे दिए गए कोड में एक टिप्पणी जोड़ा)।

protected CustomAdapter mAdapter; 

public class MyDashboardActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mydashboard); 

     final LayoutInflater mInflater = LayoutInflater.from(this); 
     mListView = (ListView)findViewById(R.id.dashboardList); 

     mAdapter = new CustomAdapter(this, <array to be adapted>); 
     mListView.setAdapter(mAdapter); 
    } 

    private class CustomAdapter extends ArrayAdapter<String> { 

     protected Context mContext; 
     protected ArrayList<String> mItems; 

     public CustomAdapter(Context context, ArrayList<String> items) { 
      super(context, R.layout.custom_list_item, items); // Use a custom layout file 
      mContext = context; 
      mItems = items; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      System.out.println("enters"); 
      if(convertView == null){ 
       convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); 
      } 

      // You'll need to use the mItems array to populate these... 
      ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); 
      ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); 
      ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); 
      ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); 

      return convertView; 
     } 
    } 
} 
+0

मुझे एहसास हुआ! धन्यवाद :) – Harsh

+2

आप एक लाइफसेवर दोस्त हैं। मैं आपको प्यार करता हूँ – A23149577

+1

इसके लिए धन्यवाद, मैं इसका उपयोग कर रहा हूं। लेकिन एक छोटा सा सुझाव: इंटेलिजे आईडीईए "inflate (R.layout.mydashboard, null)" के लिए चेतावनी देता है, और यह उत्तर http://stackoverflow.com/a/24832569/253938 "inflate (R.layout) को बदलने के लिए सुझाव देता है .mydashboard, माता पिता, झूठी) "। मैंने ऐसा किया और इंटेलिजे ने मुझे परेशान करना बंद कर दिया और यह अभी भी काम करता है। – RenniePet

2

ऐसा करने के कुछ तरीके हैं। मैं आपको अपना रास्ता दिखाऊंगा जिसमें दो लेआउट होंगे, पहला केवल सूची स्वयं ही देखें और दूसरा यह है कि प्रति सूची आइटम को टेक्स्ट कैसे दिखाना चाहिए।

listset.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <ListView 
     android:id="@+id/shipMenu" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

listitems.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/makerID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:textSize="25dp"/> 

</LinearLayout> 

ऊपर के साथ मैं अभी तक कलाकृति की जरूरत नहीं है (आप यहां छवियों डाल सकते हैं, विचार यहाँ नियंत्रण है) लेकिन मैं आइकन के लिए एक छवि दृश्य जोड़ने का इरादा रखता हूं (और आप भी अधिक टेक्स्ट व्यू जोड़ सकते हैं)। यहां मेरा कस्टम एडाप्टर क्लास है।

ListAdapter.java

class ListAdapter extends ArrayAdapter <String> 
{ 

    public ListAdapter(Context context, String[] values) { 

     super(context, R.layout.listitems, values); //set the layout that contains your views (not the one with the ListView) 
    } 

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

     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     View view = inflater.inflate(R.layout.listitems, parent, false); //same here. 

     String text = getItem(position); 

     TextView makerID = (TextView) view.findViewById(R.id.makerID); 
     makerID.setText(text); 

     return view; 
    } 

} 

अपने मुख्य गतिविधि फ़ाइल में सेट

setContentView (R.layout.listset); 

और setContentView()

ListAdapter adapter = new ListAdapter(this, MyString[]); //place your String array in place of MyString 

     ListView lv = (ListView) findViewById(R.id.ListViewID); //the ID you set your ListView to. 
     lv.setAdapter(adapter); 

संपादित के रूप में

ही कोष्ठक में इस के नीचे जोड़ने

मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, ऐसा लगता है लेकिन शायद यह किसी की मदद करेगा।