2012-07-10 84 views
4

我扩展了一个覆盖getView()方法的ArrayAdapter,以填补我的ListView对象最初的两个三个项目,但该适配器将抓住从ArrayList我传递给它的前两个或三个对象,那么只需在整个列表中以表面上随机的顺序重复这些内容。此外,当我在ListView中上下滚动时,某些行从一个列表项变为另一个列表项。 ArrayList<Credit>对象从JSONObject中填充,据我所知,在传入ArrayAdapter之前是正确的。getView()ArrayAdapter的方法重复列表

我定制ArrayAdapter

private class CreditArrayAdapter extends ArrayAdapter<Credit> { 
    private ArrayList<Credit> credits; 
    private int creditCount; 

    public CreditArrayAdapter(Context ctx, int textViewResourceId, List<Credit> items) { 
     super(ctx, textViewResourceId, items); 
     credits = (ArrayList<Credit>) items; 
     creditCount = credits.size(); 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.list_item_movie_medium, null); 
      Credit current = credits.get(position); 
      Log.d(tag, "current credit: " + current.toString()); 
      ImageView creditPicture = (ImageView) v.findViewById(R.id.image_poster_thumbnail); 
      try { 
       creditPicture.setImageBitmap(current.getPosterSmall()); 
      } catch(Exception e) { 
       Log.d(tag, "failed to set cast member picture"); 
       e.printStackTrace(); 
      } 
      TextView castMemberName = (TextView) v.findViewById(R.id.text_credit_info); 
      castMemberName.setText(current.toString()); 
     } 
     return v; 
    } 
    @Override 
    public int getCount() { 
     return creditCount; 
    } 
} 

由被称为:

appearsIn = (ListView) findViewById(R.id.listview_appears_in); 
List<Credit> credits = searcher.getCreditsByPersonId(personId); 
CreditArrayAdapter creditAdapter = new CreditArrayAdapter(getBaseContext(), R.layout.list_item_movie_medium, credits); 
creditAdapter.notifyDataSetChanged(); 
appearsIn.setAdapter(creditAdapter); 

ListView布局:

<?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="wrap_content" 
       android:orientation="vertical" 
       android:layout_centerHorizontal="true" 
       android:weightSum="2"> 
    <ScrollView android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_weight="1"> 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:orientation="vertical"> 
      <ImageView android:id="@+id/image_person_info" 
         android:layout_height="wrap_content" 
         android:layout_width="wrap_content" 
         android:contentDescription="person image"/> 
      <TextView android:id="@+id/text_person_name" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textSize="30dp"/> 
      <TextView android:id="@+id/text_person_birth" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textSize="20dp"/> 
      <TextView android:id="@+id/text_person_death" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textSize="20dp"/> 
      <TextView android:id="@+id/text_person_bio" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textSize="16dp"/> 
     </LinearLayout> 
    </ScrollView> 

    <ListView android:id="@+id/listview_appears_in" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_weight="1"/> 
</LinearLayout> 

我的列表项布局:

<?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"> 
    <ImageView android:id="@+id/image_poster_thumbnail" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content"/> 
    <TextView android:id="@+id/text_credit_info" 
       android:layout_height="wrap_content" 
       android:layout_width="fill_parent"/> 
</LinearLayout> 

回答

8

变化getView这样的:

public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.list_item_movie_medium, null); 
    } 
    Credit current = credits.get(position); 
    Log.d(tag, "current credit: " + current.toString()); 
    ImageView creditPicture = (ImageView) v.findViewById(R.id.image_poster_thumbnail); 
    try { 
     creditPicture.setImageBitmap(current.getPosterSmall()); 
    } catch(Exception e) { 
     Log.d(tag, "failed to set cast member picture"); 
     e.printStackTrace(); 
    } 
    TextView castMemberName = (TextView) v.findViewById(R.id.text_credit_info); 
    castMemberName.setText(current.toString()); 

    return v; 
} 

你的问题是你没有做所有你需要正确设置视图对象时convertView是代码! = null。

+0

完美的作品,感谢您的帮助! – Max 2012-07-10 14:41:13

+0

感谢你的这个,你帮我弄清楚了如果需要在后面(在'convertView'不为空的情况下)我有一段代码。这是造成我的卡充满了错误的内容。 – justinraczak 2016-03-28 05:04:02

2

使用此片段:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.list_item_movie_medium, null); 
     } 

     Credit current = credits.get(position); 
     Log.d(tag, "current credit: " + current.toString()); 
     ImageView creditPicture = (ImageView) v.findViewById(R.id.image_poster_thumbnail); 
     try { 
      creditPicture.setImageBitmap(current.getPosterSmall()); 
     } catch(Exception e) { 
      Log.d(tag, "failed to set cast member picture"); 
      e.printStackTrace(); 
     } 
     TextView castMemberName = (TextView) v.findViewById(R.id.text_credit_info); 
     castMemberName.setText(current.toString()); 

     return v; 
    } 
+1

我认为你需要在没有“其他”分支的情况下做到这点,否则当视图膨胀时它会在通货膨胀后立即返回。 – FoamyGuy 2012-07-10 14:36:26

+0

你是对的.. :) – 2012-07-10 14:38:45

0

尝试在任何引用高度的地方调整您的xml布局,因为android会执行一个度量来绘制每次,并将重新绘制单元格。 尝试使用listview match_parent和行上的单元格的高度。 对不起,我的英语不好。

相关问题