3

単純なクラスをListViewに適合させるカスタムアダプタを作成しようとしています。このクラスはSMSメッセージ用であり、本文、送信者アドレスなどの単純なフィールドが含まれています。以下に、アダプターのレイアウトを示します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <ImageView
    android:id="@+id/imgContactPhoto"
    android:contentDescription="Contact photo"
    android:layout_width="90sp"
    android:layout_height="90sp" />

    <TextView
    android:id="@+id/lblMsg"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgContactPhoto" 
    android:paddingLeft="10sp" />

</RelativeLayout>

そして私のカスタムアダプタクラス:

public class SmsListAdapter extends ArrayAdapter{

  private int resource;
  private LayoutInflater inflater;
  private Context context;

  @SuppressWarnings("unchecked")
  public SmsListAdapter(Context ctx, int resourceId, List objects) {
      super(ctx, resourceId, objects);
      resource = resourceId;
      inflater = LayoutInflater.from( ctx );
      context=ctx;
  }

  @Override
  public View getView (int position, View convertView, ViewGroup parent) {
        //create a new view of the layout and inflate it in the row
        convertView = ( RelativeLayout ) inflater.inflate( resource, null );

        // Extract the object to show 
        Sms msg = (Sms) getItem(position);

        // Take the TextView from layout and set the message
        TextView lblMsg = (TextView) convertView.findViewById(R.id.lblMsg);
        lblMsg.setText(msg.getBody());

        //Take the ImageView from layout and set the contact image
        long contactId = fetchContactId(msg.getSenderNum());
        String uriContactImg = getPhotoUri(contactId).toString();
        ImageView imgContactPhoto = (ImageView) convertView.findViewById(R.id.imgContactPhoto);
        int imageResource = context.getResources().getIdentifier(uriContactImg, null, context.getPackageName());
        Drawable image = context.getResources().getDrawable(imageResource);
        imgContactPhoto.setImageDrawable(image);
        return convertView;
  }
}

アダプタをアクティブ化しようとすると、getView()の最初の行で、TextViewをRelativeLayoutにキャストできないというエラーが表示されます。

私がはっきりしていないのは、そもそもなぜそれがTextViewなのかということです。私のリストアイテムのレイアウトはRelativeLayoutとして設定されており、間違っていない限り、それを膨らませる必要があります。誰かが私がこれをデバッグするのを手伝ってもらえますか?

4

3 に答える 3

3

この行で:

       convertView = ( RelativeLayout ) inflater.inflate( resource, null );

リソースの代わりに、レイアウトの完全なID-R.layout.whateverを使用してみてください

また、入力ビューがnullの場合にのみ、レイアウトを膨らませる必要があります。それ以外の場合、ビューはすでに膨らんでおり、すべての値を上書きする必要があります。

于 2013-01-15T21:42:18.353 に答える
2

BaseAdapterを使用して、カスタムアダプタを作成します。これは最初から管理するのが少し難しいですが、後で作業が簡単になります。

public class GeneralAdapter extends BaseAdapter{

private LayoutInflater mInflater    = null;
private ArrayList<String> info      = null;

public GeneralAdapter( ArrayList<String> info ) {
    this.info = info;
}

@Override
public int getCount() {
    return info.size();
}

@Override
public Object getItem(int position) {
    return info.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.YOURLAYOUT, null);

        holder                  = new ViewHolder();
        holder.generalTV        = (TextView) convertView.findViewById(R.id.lblMsg);
        holder.generalIV        = (ImageView) convertView.findViewById(R.id.imgContactPhoto);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.generalTV.setText(info.getBody());
    holder.generalIV.setBackgroundResource(R.id.YOURIMAGE);

    return null;
}

private class ViewHolder {
    TextView generalTV;
    ImageView generalIV;
}

}
于 2013-01-15T21:57:11.433 に答える
1

convertViewtoの明示的なキャストを削除するRelativeLayoutと役立つはずです。

于 2013-01-15T21:56:08.397 に答える