Я очень плохо знаком с разработкой для Android и столкнулся с небольшой проблемой.Я хочу создать пользовательский класс TextView, расширив TextView и использовать этот класс в ListView (каждая строка ListView содержит объект этого класса).
Я создал свой пользовательский класс следующим образом
public class CustomTextView extends TextView{
Context context;
Paint mPaint;
String text;
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomTextView(Context context) {
super(context);
init();
}
private void init(){
setPadding(3, 3, 3, 3);
mPaint.setTextSize(16);
mPaint.setColor(Color.GREEN);
mPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
}
@Override
public void setText(CharSequence text, BufferType type) {
this.text = (String) text;
super.setText(text, type);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Rect rect = new Rect();
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.WHITE);
paint.setStrokeWidth(3);
getLocalVisibleRect(rect);
canvas.drawRect(rect, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int reqWidth;
int reqHeight;
// width & height mode
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
// specified width & height
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
// find out Width based on widthMode
if(widthMode == MeasureSpec.EXACTLY)
// set user specified Width
reqWidth = widthSize;
else
// find out the total pixel size required for first and last text
reqWidth = (int)(mPaint.measureText(text)) ;
// find out Height based on heightMode
if(heightMode == MeasureSpec.EXACTLY)
// set user specified Height
reqHeight = heightSize;
else
// get the default height of the Font
reqHeight = (int) mPaint.getTextSize();
// set the calculated width and height of your drawing area
setMeasuredDimension(reqWidth, reqHeight);
}
}
и для каждой строки моего ListView я создал структуру xml, состоящую из TextView, My custom class и image
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:gravity="left|center"
android:layout_width="wrap_content"
android:paddingBottom="5px"
android:paddingTop="5px"
android:paddingLeft="5px">
<TextView android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dip"
android:gravity="center"
android:background="@drawable/bg"
android:textColor="#FFFF00"
android:text="hi"/>
<!--<TextView android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10px"
android:text="hi"/>
-->
<com.example.CustomTextView
android:id="@+id/TextView02"
android:layout_width="fill_parent"
android:layout_height="50px"
/>
<ImageView android:id = "@+id/image"
android:src="@drawable/icon"
android:layout_width = "50dip"
android:layout_height = "50dip"
/>
</AbsoluteLayout>
В классе Adapter моего ListView я получаю структуру, подобную этой
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflator.inflate(R.layout.listview, null);
convertView.setMinimumHeight(80);
holder = new ViewHolder();
holder.text = (TextView) convertView
.findViewById(R.id.TextView01);
holder.text2 = (CustomTextView) convertView
.findViewById(R.id.TextView02);
}
Но я получаю исключение завышения для
convertView = mInflator.inflate(R.layout.listview, null);
Однако, если вместо моего пользовательского представления я добавлю простой textView в layout.xml (структура макета каждой строки списка) тогда все работает нормально
Я искал форумы, но не понимаю, что делаю неправильно.
Пожалуйста, помогите мне в этом случае.