如何在ListView中使用新的自定义视图?

时间:2014-07-31 06:46:55

标签: java android xml android-layout listview

我是Android的新手所以请原谅我的无知〜我有几个问题我无法找到答案。

我创建了一个名为ImageTapView的新视图。我们的想法是,当您点按视图时,会出现信息叠加层。这是班级(现在只是准系统):

package com.mysite;

public class ImageTapView extends View {
    public ImageTapView(Context context, AttributeSet attrs){
        super(context, attrs);
        init(context);
    }
    private void init(Context context){

    }
    public void onClick(){

    }    
}

到目前为止,我已经

  1. 创建自定义类文件

  2. 创建一个名为image_tap_view.xml的布局xml文件(我想我可能在这里错了)

  3. 我的 res / values / attrs.xml

  4. 已添加declare-stylable

    我很困惑。现在我的ListAdapter我在ImageView返回getView()。所以我现在要返回ImageTapView,而是将ImageView传递给我的ImageTapView。所以我的问题是:如何将此ImageView传递给ImageTapView

    其次,我对布局文件感到很困惑。现在我的image_tap_view.xml我有这个:

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:custom="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.mysite.ImageTapView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#333333"
            custom:labelPosition="left"
            custom:showText="true"
            />
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Custom view Test"
                />
    
            </RelativeLayout>
    </LinearLayout>
    

    但是在我的自定义视图布局xml中拥有自己的自定义视图似乎是错误的。不会导致无限循环吗?所以我的问题是:我在哪里以及如何为新ImageTapView 指定布局?

    提前致谢!

2 个答案:

答案 0 :(得分:1)

从我发布的内容中我可以看到,你的ImageTapView需要是一个子类(扩展)View。然后在返回getView的类中,您可以返回ImageTapView,因为它在技术上仍然是View。

现在请看:http://developer.android.com/training/custom-views/index.html

image_tap_view.xml而不是com.mysite.ImageTapView中,您应该像以前一样使用ImageView。在ImageTapView类中,当您需要此ImageView组件时,只需创建一个并从xml中解析它。

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#333333"
    custom:labelPosition="left"
    custom:showText="true"
    />

public class ImageTapView extends View {
public ImageTapView(Context context, AttributeSet attrs){
    super(context, attrs);
    init(context);
}
private void init(Context context){
     ImageView iv = (ImageView)findViewById(//retrieve id set in xml);
}
public void onClick(){

}    

}

答案 1 :(得分:1)

在xml内部只保留ImageView并在自定义视图的内部init函数中膨胀此xml并将其返回。

在getView中创建一个新的自定义视图实例并将其返回。

XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#333333"
        />
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Custom view Test"
            />

        </RelativeLayout>
</LinearLayout>

自定义视图:

public class ImageTapView extends LinearLayout{
    public ImageTapView(Context context, AttributeSet attrs){
        super(context, attrs);
        init(context);
    }
      public ImageTapView(Context context){
        super(context);
        init(context);
    }
    private void init(Context context){
       LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         inflater.inflate(R.layout.your_xml, this, true);
    }
    public void onClick(){

    }    

}

getView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ImageTapView view = (ImageTapView ) convertView;
    if (view == null)
        view = new ImageTapView (getContext());

    return view;
}