4

ArrayAdapterオーバーライドされたgetView()メソッドを使用してオブジェクトを埋めるために拡張しましたListViewが、アダプターは、渡したオブジェクトから最初の2つまたは3つのオブジェクトを取得し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>
4

3 に答える 3

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のときに、Viewオブジェクトを正しく設定するために必要なすべてのコードを実行していなかったことです。

于 2012-07-10T14:37:42.240 に答える
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;
    }
于 2012-07-10T14:34:59.903 に答える
0

高さを参照する場所でxmlレイアウトを調整してみてください。これは、Androidが毎回描画するための測定を行い、セルを再度描画するためです。listview match_parentと、行の正確な高さのセルで使用してみてください。申し訳ありませんが私の悪い英語。

于 2013-05-25T20:47:37.663 に答える