2012-10-30 2 views
13

Gibt es ein XML-Tag, das ich in einer Layoutdatei verwenden kann, die ListView.addHeaderView() entspricht?Gibt es ein XML-Tag, das "ListView.addHeaderView" entspricht?

+0

Ich denke, es ist nicht in Originallistenansicht ist vorhanden. Eine mögliche Lösung besteht darin, 'ListView' zu erweitern und ein benutzerdefiniertes Attribut zu erstellen, um die Header-Ansicht zu setzen. –

+0

@Yul Kann ich benutzerdefinierte Attribute erstellen, die in einer XML-Layoutdatei verwendet werden können? Ich werde das weiter untersuchen müssen ... –

+1

[** Hier **] (http://kevindion.com/2011/01/custom-xml-attributes-for-android-widgets/) buddy –

Antwort

18

Ich schrieb eine einfache ListView wie Ihre Anforderung.

  1. Declare benutzerdefinierte Attribut in attrs.xml in value Ordner:

    <resources> 
        <declare-styleable name="HeaderListViewFromXML"> 
         <attr name="headerView" format="reference"/> 
        </declare-styleable> 
    </resources> 
    
  2. erstellen HeaderListViewFromXML Klasse erweitert ListView

    public class HeaderListViewFromXML extends ListView { 
        private int headerId; 
    
        public HeaderListViewFromXML(Context context) { 
         this(context, null); 
        } 
    
        public HeaderListViewFromXML(Context context, AttributeSet attrs) { 
         this(context, attrs, 0); 
        } 
    
        public HeaderListViewFromXML(Context context, AttributeSet attrs, int defStyle) { 
         super(context, attrs, defStyle); 
         TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HeaderListViewFromXML, defStyle, defStyle); 
    
         try { 
          headerId = a.getResourceId(R.styleable.HeaderListViewFromXML_headerView, View.NO_ID); 
          if (headerId != View.NO_ID) { 
           LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
           View header = inflater.inflate(headerId, null); 
           addHeaderView(header); 
          } 
         } finally { 
          a.recycle(); 
         } 
        } 
    } 
    
  3. deklarieren benutzerdefinierte HeaderListViewFromXML in layout.xml

    <RelativeLayout 
         xmlns:android="http://schemas.android.com/apk/res/android" 
         xmlns:app="http://schemas.android.com/apk/res-auto" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent"> 
        <com.example.rewidget.HeaderListViewFromXML 
          android:id="@+id/listWithHeader" 
          android:layout_width="fill_parent" 
          android:layout_height="150dp" 
          android:layout_marginTop="60dp" 
          android:background="#00FF00" 
          // custom attribute. Point to layout in header1.xml 
          app:headerView="@layout/header1" /> 
    </RelativeLayout> 
    
  4. In Aktivität verwenden wie normale ListView

    public class MainActivity extends Activity { 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
         ListView list = (ListView) findViewById(R.id.listWithHeader); 
    
         String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" }; 
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values); 
    
         list.setAdapter(adapter); 
        } 
    } 
    
+0

Nifty! Danke für die Post. –

Verwandte Themen