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

标签 android android-listview android-arrayadapter

我扩展了一个 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;
    }
}

被调用者:

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>

最佳答案

像这样更改 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 时,您没有执行正确设置 View 对象所需的所有代码。

关于android - ArrayAdapter 的 getView() 方法重复列表中的前两个或三个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415618/

相关文章:

java - 将操作栏添加到自定义对话框

android - 更新 Android 中的 ArrayAdapter

android - 自定义数组适配器初始化错误

java - 防止发生错误时强行关闭

安卓服务生命周期

android - 更新显示对话框中的内容

java - 从 ListView Adapter 中的循环构造 ID 数组 android

安卓查询 : grid display (images)

android - 带有复选框的 ListView 中的 IndexOutOfBoundsException

android - 从 Android 中的 GoogleApiClient 获取我的应用程序的访问 token