2013-09-05 8 views
7

में सरल एडाप्टर मैं सरणीसूची और सरल एडाप्टर का उपयोग करके सूचीदृश्य में कुछ दिखाने की कोशिश करता हूं। मैंने नीचे कुछ ऐसा करने की कोशिश की लेकिन मेरे परिणाम में सरणीसूची के अंतिम नाम दिखाए गए। मेरा गलत क्या है जिसे मैं समझ नहीं सकता।सरणी सूची के साथ सूचीदृश्य, एंड्रॉइड

final ListView listView = (ListView) findViewById(R.id.mylist); 

    ArrayList<HashMap<String, String>> list_of_bookmarks = new ArrayList<HashMap<String, String>>(); 

     HashMap<String, String> b = new HashMap<String, String>(); 

     String[] from = { "php_key","c_key","android_key","hacking_key" }; 
     String[] name_of_bookmarks = { "php","c","android","hacking" }; 

      for(int i=0;i<4;i++) 
      { 
       b.put(from[i],name_of_bookmarks[i]); 
       list_of_bookmarks.add(b); 
      } 

     }; 

      int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1}; 

      SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_bookmarks, R.layout.list_layout, from, to);   
      listView.setAdapter(adapter); 

मैं सिर्फ एक सूचीदृश्य में "php", "c", "android", "हैकिंग" दिखाना चाहता हूं। और ऐसा करने के लिए और अधिक प्रभावी तरीका क्या होना चाहिए। मैं एक नौसिखिया हूं ताकि आप बेहतर तरीके से सुझाव दे सकें कि मुझे

+0

इसका प्रदर्शन केवल अंतिम मान? –

+0

"हैकिंग, हैकिंग, हैकिंग, हैकिंग" जैसे अंतिम मूल्य 4 बार –

उत्तर

7

Main.xml

<LinearLayout 

    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="60dp" > 


    <ListView 
     android:id="@+id/zone_list" 
     android:layout_marginBottom="70dp" 
     android:background="@drawable/batteryborder" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

setlanguage।एक्सएमएल

<?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="60dp"> 

    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:textSize="18dp" 
     android:gravity="center_vertical" /> 

</LinearLayout> 

अपनी गतिविधि फ़ाइल के में जोड़ने onCreate()

ListView listView; 

String[] from = { "php_key","c_key","android_key","hacking_key" }; 

ArrayAdapter arrayAdapter; 

listView = (ListView) findViewById(R.id.zone_list); 

arrayAdapter = new ArrayAdapter(this,R.layout.setlanguage, R.id.tvName, from); 

listView.setAdapter(arrayAdapter); 
2

का पालन करना चाहिए, आप अपने int [] ऑब्जेक्ट में एक ही दृश्य का पुन: उपयोग कर रहे हैं।

int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1};

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

SimpleAdapter का उपयोग करने के लिए आपको XML में प्रत्येक दृश्य को अलग-अलग आईडी के साथ परिभाषित करने की आवश्यकता होगी।

int[] to = { R.id.txt1,R.id.txt2,R.id.txt3,R.id.txt4};

SimpleAdapter संबंध में आसान हो सकता है कि यह आंतरिक जटिलता है, लेकिन यह निश्चित रूप से वास्तव में उपयोग करने के लिए आसान नहीं है। ArrayAdapter के साथ आप इसे आइटमों की सूची पास कर सकते हैं और इसे स्वचालित रूप से दृश्य उत्पन्न कर सकते हैं। यह किसी भी आकार का हो सकता है जब तक आपको स्मृति से बाहर नहीं निकलता है। (उदाहरण के लिए नीचे देखें)

एक बार जब आप कस्टम एडाप्टर के साथ काम करना शुरू कर देते हैं तो मैं आपको सलाह देता हूं कि आप Romain Guy & Adam Powell's I/O talk देखें। सीखने में बहुत कुछ करना है, लेकिन वे ListViews काम को समझाने का एक अच्छा काम करते हैं।

//List of Items 
String[] name_of_bookmarks = { "php","c","android","hacking" }; 

//Create your List object for the ArrayAdapter 
//and make it the same size as name_of_books 
List<String> listBookmarks = new ArrayList<String>(Array.getLength(name_of_bookmarks)); 

//Add name_of_bookmarks contents to listBookmarks 
Collections.addAll(listBookmarks, name_of_books); 

//Create an ArrayAdapter passing it the Context, a generic list item and your list 
//An alternative to "this" would be "getApplicationContext()" from your main activity 
//or "getActivity()" from a fragment. "getBaseContext()" is not recommended. 
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.list_item_text, listBookmarks); 

//Set the adapter to your ListView 
final ListView listView = (ListView) findViewById(R.id.mylist); 
listView.setAdapter(arrayAdapter); 
+0

हाँ अच्छा बिंदु। वह एक ही वस्तु का उपयोग कर रहा है। –

+0

तो मुझे क्या करना चाहिए ?? @ जोन –

+0

प्रत्येक के लिए अलग-अलग टेक्स्टव्यू का उपयोग करें। –

0

प्रयास करें यह एक

public class MyFragment extends ListFragment{ 

    String[] from = { "php_key","c_key","android_key","hacking_key" }; 
    String[] name_of_bookmarks = { "php","c","android","hacking" }; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     List<HashMap<String, String>> list= new ArrayList<HashMap<String,String>>(); 

     for (int i = 0; i < name_of_bookmarks.length; i++) { 

      HashMap<String, String> map= new HashMap<String, String>(); 
      map.put("key", name_of_bookmarks[i]); 
      list.add(map); 
     } 
     String[] from = { "key" }; 

     int[] to = { R.id.txt}; 

     SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), list, R.layout.list_layout, from, to); 
     setListAdapter(adapter); 

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

} 
+0

text1 लेआउट में एक टेक्स्टव्यू है ताकि मैं टेक्स्टव्यू –

+0

में नाम दिखा सकूं ताकि टेक्स्टवीव –

+0

में दिखाना संभव हो। मुझे R.id.txt2 –

9

आप के लिए मेरी सलाह एक अलग वर्ग है कि एडाप्टर फैली (या इसके बारे में कुछ उपवर्ग) बनाने के लिए

यहाँ एक का एक सरल उदाहरण है किया जाएगा स्ट्रिंग सरणी एडाप्टर।

package ro.gebs.captoom.adapters; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import antistatic.spinnerwheel.adapters.AbstractWheelTextAdapter; 

import com.example.captoom.R; 

public class LanguagesAdapter extends AbstractWheelTextAdapter { 
    // Countries names 
    private String languages[]; 

    public LanguagesAdapter(Context context) { 
     super(context, R.layout.lang_item, NO_RESOURCE); 
     languages = context.getResources().getStringArray(R.array.lang_array); 
     setItemTextResource(R.id.language_txt); 
    } 

    @Override 
    public View getItem(int index, View cachedView, ViewGroup parent) { 
     View view = super.getItem(index, cachedView, parent); 
     return view; 
    } 

    @Override 
    public int getItemsCount() { 
     return languages.length; 
    } 

    @Override 
    protected CharSequence getItemText(int index) { 
     return languages[index]; 
    } 
} 

और उपयोग सिर्फ विधि .setAdapter();

या एक और उदाहरण है जो एक arrayAdapter का उपयोग करता है का उपयोग आसान है: एक अधिक जटिल वर्ग है कि के लिए

package apc.example; 

import java.util.ArrayList; 

import utils.BitmapManager; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class PersonAdapter extends ArrayAdapter<Person> { 

    Context context; 
    int layoutResourceId; 
    ArrayList<Person> data = null; 

    public PersonAdapter(Context context, int layoutResourceId, 
      ArrayList<Person> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ItemHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ItemHolder(); 
      holder.imgIcon = (ImageView) row.findViewById(R.id.icon); 
      holder.txtName = (TextView) row.findViewById(R.id.title); 
      holder.txtDescription = (TextView) row.findViewById(R.id.desc); 

      row.setTag(holder); 
     } else { 
      holder = (ItemHolder) row.getTag(); 
     } 

     Person bean = data.get(position); 
     holder.txtName.setText(bean.getName()); 
     holder.txtDescription.setText(bean.getDescription()); 


     Bitmap b = BitmapFactory.decodeResource(context.getResources(), R.drawable.user); 
     BitmapManager.INSTANCE.setPlaceholder(b); 
     BitmapManager.INSTANCE.loadBitmap(bean.getUrl(), holder.imgIcon, 80, 80); 

     return row; 
    } 

    public static class ItemHolder { 
     public ImageView imgIcon; 
     TextView txtName; 
     TextView txtDescription; 
    } 

    public void updateAdapter(ArrayList<Person> pers){ 
     this.data = pers; 
    } 
} 

यह एक एडाप्टर का एक उदाहरण है एक साधारण स्ट्रिंग के बजाय अधिक फ़ील्ड। लेकिन इसे आसानी से ArrayAdapter<String> में संशोधित किया जा सकता है और फिर वहां से जा सकता है।

वैसे भी मुझे लगता है कि सूचीदृश्यों के लिए अपने कस्टम एडेप्टर लिखना हमेशा एक अच्छा अभ्यास है।

आशा है कि इससे मदद मिलती है!

+0

+ 1 देखें! यह एक मूल्यवान उदाहरण है। – naXa

-1

जो कुछ भी आप चेहरा समस्या है वास्तव में मैं समस्या बुलाया "सूची देखें प्रदर्शन की अंतिम स्थिति का चेहरा हूँ एक ऐरे का डेटा ... "

समस्या हैश मैप

के साथ उत्पन्न की गई समस्या है 10
final ListView listView = (ListView) findViewById(R.id.mylist); 

ArrayList<HashMap<String, String>> list_of_bookmarks = new ArrayList<HashMap<String, String>>(); 

    String[] from = { "php_key","c_key","android_key","hacking_key" }; 
    String[] name_of_bookmarks = { "php","c","android","hacking" }; 

     for(int i=0;i<4;i++) 
     { 
      HashMap<String, String> b = new HashMap<String, String>(); 
      b.put(from[i],name_of_bookmarks[i]); 
      list_of_bookmarks.add(b); 
     } 

    }; 

     int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1}; 

     SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_bookmarks, R.layout.list_layout, from, to);   
     listView.setAdapter(adapter); 

यह एक बाहर की कोशिश करो तो कोई संदेह अपने मन में बनाया गया तो आस्क मी जो भी प्रश्न फिर , बस आप अपने हैश मानचित्र आपकी लूप के लिए अंदर घोषित करना है ...

हैश मानचित्र का प्रयोग करना लूप वैरिएबल 'बी' के अंदर आपके प्रत्येक & प्रत्येक बार एक अलग ऑब्जेक्ट के रूप में माना जाता है। और फिर केवल ऐश सूची प्रदर्शन हैश मैप के विभिन्न ऑब्जेक्ट प्रदर्शित करें।

आप स्टोर मूल्य हैश नक्शा करने के लिए एक ही वस्तु का उपयोग कर रहे हैं और चर ही नाम के साथ अवहेलना है तुम क्यों सामना कर रहे हैं कि समस्या धन्यवाद था ...

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