2

リストビューとリストの読み込みにアダプターを使用しています。各リストアイテムにはTextView、EditText、Imageがあります。リスト行の位置に応じて矢印と編集テキストの表示を設定します。すべてが正常に機能します。初めてリストをロードします...しかし、リストをスクロールすると、アイテムの可視性が変化し続けます...この問題で私を助けてください...関連するコードが添付されています...

<?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="horizontal"  android:background="#FFFFFF">
    <TextView android:layout_height="wrap_content"  android:layout_width="0dip"
            android:textSize="20dip" android:layout_weight="1"
            android:id="@+id/textview_add_lot_list" android:textColor="@android:color/black"
            android:paddingTop="10dip" android:paddingBottom="10dip"
            android:paddingLeft="10dip"/>
    <EditText android:layout_height="fill_parent" android:layout_width="0dip"
            android:layout_weight="1" android:id="@+id/et_add_lot_list"
            android:layout_gravity="center_vertical"/>
    <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content"
            android:id="@+id/imageview_arrow_add_lot_list" android:layout_gravity="center_vertical"
            android:visibility="invisible" android:src="@drawable/more_reviews_arrow"
            android:paddingRight="10dip"/>
</LinearLayout>

Javaコードアクティビティ...

final ArrayList<String> listItems       =   new ArrayList<String>();
        listItems.add("Parking name");
        listItems.add("Address");
        listItems.add("City");
        listItems.add("State");
        listItems.add("Zip");
        listItems.add("Phone");
        listItems.add("Web Address");
        listItems.add(" ");
        listItems.add("Parking Image");
        listItems.add(" ");
        listItems.add("Open Hours");
        listItems.add(" ");
        listItems.add("Web Reviews");

        final AddParkingLotAdapter adapter  =   new AddParkingLotAdapter(mAppContext,0,listItems);
        lv.setAdapter(adapter);

Javaコード...アダプタ

public class AddParkingLotAdapter extends ArrayAdapter<String> {
    private ArrayList<String> mStrings;
    private LayoutInflater mInflater;
    private AppContext mContext;

    private static int NON_EMPTY_ROW    =   1;                                                                                                          
    private static int EMPTY_ROW       =    0;

    public AddParkingLotAdapter(Context context, int resId, List<String> strings) {
        super(context, resId,strings);
        mStrings        =   (ArrayList<String>) strings;
        mContext        =   (AppContext) context;
        mInflater       =   LayoutInflater.from(context);
    }
    @Override
    public int getViewTypeCount() {
        return 2;                               
    }
    @Override
    public int getCount() {
        return mStrings.size();     
    }
    @Override
    public String getItem(int position) {
        return mStrings.get(position);
    }
    @Override
    public int getItemViewType(int position) {
        if(position==7||position==9||position==11){
            return EMPTY_ROW;
        }else{
            return NON_EMPTY_ROW;
        }
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView itemTextView   =   null;

        //different inflations for different type rows..
        if(getItemViewType(position) == EMPTY_ROW){
            if (convertView == null) {
                convertView         =   mInflater.inflate(R.layout.review_empty_row, null);
            }
        }else if(getItemViewType(position) == NON_EMPTY_ROW){
            if (convertView == null) {
                convertView     =   mInflater.inflate(R.layout.add_parkinglist_item, null);
            }
            itemTextView        =   (TextView) convertView.findViewById(R.id.textview_add_lot_list);
            itemTextView.setText(mStrings.get(position));
            if (position==3||position==8||position==10||position==12){
                ImageView itemImageView       =   (ImageView)convertView.findViewById(R.id.imageview_arrow_add_lot_list);
                itemImageView.setVisibility(View.VISIBLE);
                EditText editText             =   (EditText)convertView.findViewById(R.id.et_add_lot_list);
                editText.setVisibility(View.INVISIBLE);
            }
        }
        return convertView;
    }
}
4

1 に答える 1

5

このコードでは:

if (position==3||position==8||position==10||position==12){
    ImageView itemImageView       =   (ImageView)convertView.findViewById(R.id.imageview_arrow_add_lot_list);
    itemImageView.setVisibility(View.VISIBLE);
    EditText editText             =   (EditText)convertView.findViewById(R.id.et_add_lot_list);
    editText.setVisibility(View.INVISIBLE);
}

あなたはelse句を持っていません。つまり、position が 0、1、2、4、5、または 6 の場合、ビューの可視性を明示的に設定しないため、可視性は、ビューがリサイクルされたときに設定されたものになります。が null でない場合convertViewは、可視性が以前に変更された可能性のあるアイテムの可視性を常にリセットする必要があります。

于 2012-06-28T13:42:34.547 に答える