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

您真的不想在自定義適配器的getView()中的每一行都爲新視圖充氣,忽略提供的convertView。當適配器中有1000行時,ListView不會使用1000個單獨的視圖,視圖會被回收。

所以我只需撥打:

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

,然後使用view.findViewById()返回的是一個ArrayAdapter返回視圖之前設定你個人的子視圖中的數據。 ArrayAdapter已經負責重新使用循環視圖。

注意ArrayAdapter已經設置TextView的本身,所以你只需要設置ImageView的,但是對於一個ArrayAdapter需要知道你的TextView的id,因此使用構造函數:

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

因爲視圖被回收,確保始終設置ImageView源代碼。如果某一行沒有圖像,則需要清除它,而不是無所事事。

編輯:另一個問題是有關的行佈局。垂直邊距和填充對於70dp的有限垂直行高度來說太多了。

編輯:這裏的適配器的一個例子。

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)擴展BaseAdapter而不是ArrayAdapter。

2)實現base adapter的getCount方法,返回list.size作爲返回值(integer)。這裏的列表可以是你的數組長度。

+0

感謝您的建議,是的,我可以擴展BaseAdapter並使ListRow類或其他東西放在BaseAdapter,但你也知道我的實際問題的答案? – Loolooii

相關問題