2013-09-05 3 views
7

arraylist 및 간단한 어댑터를 사용하여 listview에 뭔가를 표시하려고합니다. 나는 아래와 같은 것을 시도했다. 그러나 나의 결과에서 arraylist의 성을 보여준다. 내 잘못은 무엇입니까 이해할 수 없습니다.목록보기 arraylist, 안드로이드의 간단한 어댑터

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", "hacking"을 listview에 표시하고 싶습니다. 그리고 더 효율적인 방법이 있어야합니다. 나는 초보자이므로 따라야하는 더 좋은 방법을 제안 할 수 있습니다.

+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

<?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> 

당신은 얼굴 문제인가 무엇이든

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의 각보기를 다른 ID로 정의해야합니다. 그것은 내부의 복잡성의에

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

그럼 어떻게해야합니까 ?? @Jon –

+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

textveiw에 표시 할 수 있습니다 –

+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>으로 수정 한 다음 거기에서 이동할 수 있습니다.

어쨌든 나는 항상 listviews에 대한 사용자 지정 어댑터를 작성하는 것이 가장 좋습니다.

희망이 도움이됩니다.

+0

+1을 참조하십시오! 중요한 예입니다. – naXa

-1

는 정확히 내가 마지막 위치 "목록 보기 디스플레이 호출 문제의 얼굴을 건가요 활동 파일의 에서에서 onCreate()를 추가 배열의 데이터 ... "

문제가 해시 맵을 사용하여 생성되었습니다

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

당신의 마음에서 만든 의심의 여지가 다시 간단하게 당신이 당신의 해시지도 귀하의 For 루프 내에서 선언해야 무엇이든 질문 물어보세요 경우 해시지도를 사용하여 ...

이 한을 시도 내부 루프 변수 'b'는 각각 &을 만들어 다른 객체로 간주합니다. 그런 다음 단순히 배열 목록에 해시 맵의 다른 객체를 표시합니다.

...

관련 문제