ArrayAdapter的getView()方法重复列表中的前两个或三个项目

Max*_*Max 4 android android-arrayadapter android-listview

ArrayAdapter使用重写getView()方法扩展了一个来填充我的ListView对象,但是适配器会从ArrayList我传递给它的前两个或三个对象中获取,然后只需在列表的整个长度上以看似随机的顺序重复这些对象.此外,当我在其中向上和向下滚动时ListView,某些行会从一个列表项更改为另一个列表项.该ArrayList<Credit>对象从JSONObject填充,据我所知,在传递给对象之前是正确的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

被召唤:

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);
Run Code Online (Sandbox Code Playgroud)

包含以下内容的布局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>
Run Code Online (Sandbox Code Playgroud)

我的列表项布局:

<?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>
Run Code Online (Sandbox Code Playgroud)

Foa*_*Guy 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;
}
Run Code Online (Sandbox Code Playgroud)

您的问题是当您没有执行在convertView为!= null时正确设置View对象所需的所有代码.