0

텍스트와 이미지가 포함 된 사용자 지정 ArrayAdapter가 있지만 목록에 항목이 표시되지 않습니다. 이 내 사용자 지정 어댑터입니다 :사용자 지정 ArrayAdapter 행이 목록에 표시되지 않습니다.

import android.content.Context; 
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 DrawerArrayAdapter extends ArrayAdapter<String> { 
    private final Context context; 
    private final String[] entries; 
    private final Integer[] imageIds; 

    public DrawerArrayAdapter(Context context, String[] entries, Integer[] imageIds) { 
     super(context, R.layout.drawer_list_item, entries); 

     this.context = context; 
     this.entries = entries; 
     this.imageIds = imageIds; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View rowView = inflater.inflate(R.layout.drawer_list_item, parent, false); 
     TextView entryView = (TextView) rowView.findViewById(R.id.drawer_list_entry); 
     ImageView iconView = (ImageView) rowView.findViewById(R.id.drawer_list_icon); 
     entryView.setText(entries[position]); 
     iconView.setImageResource(imageIds[position]); 

     return rowView; 
    } 
} 

그리고 이것은 조각입니다 :

import android.app.ListFragment; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.v4.app.ActionBarDrawerToggle; 
import android.support.v4.widget.DrawerLayout; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

public class DrawerFragment extends ListFragment { 

    private String[] drawerListEntries; 
    private DrawerLayout drawerLayout; 
    private Integer[] drawerListIcons; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     drawerListIcons = new Integer[] {R.drawable.ic_action_user,R.drawable.ic_action_user,R.drawable.ic_action_user,R.drawable.ic_action_user}; 
     drawerListEntries = getResources().getStringArray(R.array.drawer_items); 
     setListAdapter(new DrawerArrayAdapter(getActivity(), drawerListEntries, drawerListIcons)); 


    } 

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

     return inflater.inflate(R.layout.drawer_fragment, container, false); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     drawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); 
    } 


    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Toast.makeText(getActivity(), 
     getListView().getItemAtPosition(position).toString(), 
     Toast.LENGTH_LONG).show(); 
    } 



    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     //boolean drawerOpen = drawerLayout.isDrawerOpen(drawerList); 
     //menu.findItem(R.id.action_user).setVisible(!drawerOpen); 
     super.onPrepareOptionsMenu(menu); 
    } 

} 

이것은 나의 drawer_list_item.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="70dp" 
    android:padding="5dp" 
    android:orientation="vertical" > 
    <TextView 
     android:id="@+id/drawer_list_entry" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="12dp" 
     android:paddingLeft="20dp" 
     android:paddingBottom="20dp" 
     android:paddingTop="20dp" 
     android:textSize="24sp" 
     android:textColor="@color/light_blue" 
     android:fontFamily="sans-serif-light" > 
     </TextView> 

    <ImageView 
     android:id="@+id/drawer_list_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:contentDescription="@string/drawer_icon"> 
    </ImageView> 
</LinearLayout> 

나는 아마에게 난 그냥를 사용하여 언급해야 할 때 텍스트가있는 일반 ArrayAdapter는 완벽하게 작동합니다. 문제가있는 사람은 누구입니까?

답변

0

제공된 convertView를 무시하고 사용자 지정 어댑터의 getView()에있는 모든 행에 대해 새로운 뷰를 실제로 확장하고 싶지는 않습니다. 어댑터에서 행이 1000 개일 때 ListViews에서 1000 개의 개별보기를 사용하지 않고 뷰를 재활용합니다.

View view = super.getView(position, convertView, parent); 

을 다음 ArrayAdapter와 반환하는 뷰를 반환하기 전에 개별 하위 뷰의 데이터를 설정하는 view.findViewById()를 사용 :

그래서 나는 단순히 부를 것이다. ArrayAdapter는 이미 재생 된 뷰를 재사용합니다. ArrayAdapter와 이미 당신은 단지 이미지 뷰를 설정해야합니다, 그래서 텍스트 뷰 자체를 설정하지만 것을

참고 ArrayAdapter와 생성자 당신의 텍스트 뷰의 id를 알아야하므로 사용하는 것을 위해 :

super(context, R.layout.drawer_list_item, R.id.drawer_list_entry, entries); 

때문에를 뷰를 재활용 한 경우 항상 ImageView 소스를 설정해야합니다. 특정 행에 이미지가 없으면 아무것도하지 말고 지울 필요가 있습니다.

편집 : 또 다른 문제는 행 레이아웃과 관련이 있습니다. 세로 여백과 패딩은 제한된 세로 행 높이가 70dp 인 경우 너무 많습니다.

EDIT : 여기서 어댑터의 예입니다.

public class DrawerArrayAdapter extends ArrayAdapter<String> { 

    private final Integer[] mImageIds; 

    public DrawerArrayAdapter(Context context, String[] entries, Integer[] imageIds) { 
     super(context, R.layout.drawer_list_item, R.id.drawer_list_entry, entries); 
     mImageIds = imageIds; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView = super.getView(position, convertView, parent); 
     ((ImageView)rowView.findViewById(R.id.drawer_list_icon)).setImageResource(mImageIds[position]); 
     return rowView; 
    } 
} 
+0

유용한 정보를 제공해 주셔서 감사합니다. 방금 언급 한대로했는데 텍스트 나 이미지 모두 목록에 나타나지 않았습니까? 오류/예외는 전혀 없습니다. 목록 항목을 클릭하고 탐색 기능도 사용할 수 있지만 텍스트 나 이미지는 표시되지 않습니다. 문제가 될 수있는 것이 무엇인지 알고 있습니까? – Loolooii

+0

drawer_list_item의 LinearLayout에서 'android : layout_height = "wrap_content"'를 사용하십시오. 제한된 높이의 70dp에 대해서는 수직 여백과 패딩이 너무 많습니다. –

+0

그런 종류의 작품에 감사드립니다. 나는 지금 아이콘을 보았지만 여전히 텍스트가없고 무엇이 잘못되었는지를 알 수 없다. 나는 또한 모든 패딩과 여백을 텍스트에서 제거했지만 아직 보지 못했습니다. TextView에서 이상한 것을 보시겠습니까? 나는 몇 시간 동안이 일을하고 있는데, 이것은 너무 쉽지만 동시에 자극적입니다. – Loolooii

0

여기에 몇 가지 제안 사항이 있습니다.

1) ArrayAdapter 대신 BaseAdapter를 확장하십시오.

2) 기본 어댑터의 getCount 메소드를 구현하고 list.size를 반환 값 (정수)으로 반환합니다. 여기 목록은 배열의 길이가 될 수 있습니다.

+0

귀하의 제안에 감사드립니다. 그렇습니다. 저는 BaseAdapter를 확장하고 ListRow 클래스 나 다른 것을 만들고 BaseAdapter에 넣을 수 있습니다. 그러나 실제 질문에 대한 답을 알고 있습니까? – Loolooii

관련 문제