Android自定义适配器+ListView(未完全工作)

4
我正在开发我的第一个数据库Android应用。我已经成功实现了自定义的适配器和它自己的行视图,其中应该包含图标、名称和描述。除了名称以外,一切都正常。我尝试通过调试并在logcat中输出来解决问题,但一切看起来都很好。只是我的应用程序不会显示出来。有人可以帮忙看看吗?非常感谢。
我的自定义行视图称为exercise_item.xml。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip" >

<ImageView
    android:id="@+id/icon"
    android:layout_width="wrap_content"
    android:layout_height="60dip"
    android:layout_alignParentBottom="true"
    android:layout_alignParentTop="true"
    android:layout_marginRight="6dip"
    android:contentDescription="TODO"
    android:src="@drawable/ic_launcher" />

<TextView
    android:id="@+id/description"
    android:layout_width="fill_parent"
    android:layout_height="26dip"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_toRightOf="@id/icon"
    android:ellipsize="marquee"
    android:singleLine="true"
    android:textSize="12sp" />

<TextView
    android:id="@+id/name"
    android:layout_width="fill_parent"
    android:layout_height="34dip"
    android:layout_above="@id/description"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@id/icon"
    android:textSize="16sp" />

现在我们正在工作的活动布局(我想最重要的部分是列表):

<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ExerciseManagementActivity" >


<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="24dp"
    android:text="@string/title_activity_exercise_management" 
    android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
    android:id="@+id/button_add"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="26dp"

    android:text="Add new" />

 <EditText
     android:id="@+id/editText1"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:layout_below="@+id/button_add"
     android:layout_centerHorizontal="true"
     android:layout_margin="10dp"
     android:layout_marginTop="25dp"
     android:ems="10"
     android:hint="name of exercise" >

     <requestFocus />
 </EditText>

 <ListView
     android:id="@android:id/list"
     android:layout_width="match_parent"
     android:layout_height="270dp"
     android:layout_below="@+id/editText1"
     android:layout_centerHorizontal="true"
     android:layout_marginTop="32dp" >
 </ListView>

 <TextView
android:id="@+id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginTop="32dp"
android:text="@string/main_no_items"/>

最后,定制适配器:
public class ExerciseAdapter extends ArrayAdapter<Exercise>{

      private final Context context;


      public ExerciseAdapter(Context context, int resource, ArrayList<Exercise> results) {
        super(context, resource, results);
        this.context = context;
      }

      /*private view holder class*/
        private class ViewHolder {
            ImageView imageView;
            TextView txtTitle;
            TextView txtDesc;
        }


        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;

            LayoutInflater mInflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.exercise_item, null);
                holder = new ViewHolder();
                holder.txtDesc = (TextView) convertView.findViewById(R.id.description);
                holder.txtTitle = (TextView) convertView.findViewById(R.id.name);
                holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
                convertView.setTag(holder);
            } else
                holder = (ViewHolder) convertView.getTag();

            holder.txtDesc.setText(getItem(position).getDescription());
            Log.d("ITEM DESC", "ITEMDESC: " + getItem(position).getDescription() );
            holder.txtTitle.setText( getItem(position).getName());
            Log.d("ITEM NAME", "ITEMNAME: " + getItem(position).getName() );
            holder.imageView.setImageResource(R.drawable.ic_launcher);

            return convertView;
        }

    } 

正如我之前所提到的,没有错误,应用程序运行正常。正确的图标和描述被显示出来,但是没有名称(即使它们在logcat中)。我尝试将硬编码字符串设置为名称,但没有成功。这一定与布局有关,或者我错了吗?
再次感谢您的帮助。 Igor

2
布局对我来说似乎可行。如果你在“TextViews”中硬编码文本,它是否也可以在您的布局编辑器中工作? - codeMagic
你的Activity代码在哪里?可能有些地方出了问题。 - Eenvincible
1
尝试在两个地方将android:layout_height="26dip","34dip"更改为wrap_content并删除android:layout_height="?android:attr/listPreferredItemHeight" - Erik
所以,除非您收到的值大于硬编码的值并将名称推出屏幕,否则它不应该是“layout”的问题。但是您说您在日志中收到了正确的数据?很奇怪。 - codeMagic
codeMagic,我在那里硬编码了名称和描述,并在图形布局中检查了两者是否可见。尝试将此布局分配给空白活动,它启动并显示图片和我的两个字符串=可见。@Erik,我尝试更改您建议的内容,但没有任何反应。我甚至尝试将名称中的所有属性设置为与描述中相同(这是有效的)。但是名称不会显示出来。我的自定义适配器中的最后5行有效,但名称仍然不会显示出来。LogCat 知道 getItem(position).getDescription() 和 getItem(position).getName() 的正确值。 - foxy
1个回答

1
请从以下内容中删除这些行:android:layout_alignParentBottom="true" android:layout_alignParentRight="true"
来自


大家好.. 我放弃了,创建了新的布局,现在它正常工作了...不知道问题出在哪里,但是重要的是,它已经被修复了。 - foxy
1
@foxy,我之前提到的是错误的,你的小部件重叠在一起。 - Pulkit Sethi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接