android listView 自定義界面

ListView實現(xiàn)步驟:

1、初始化ListView

2、實現(xiàn)展示數(shù)據(jù)Item

3、實現(xiàn)ItemAdapter 繼承自ArrayAdapter

4、實現(xiàn)自定義item界面 layout

5、關聯(lián) listView - ItemAdapter - listData

具體代碼:
1、初始化ListView

 <ListView
   android:id="@+id/listview"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
 </ListView>

2、實現(xiàn)展示數(shù)據(jù)Item

public class Item {

private String name;
private int  imgId;

public Item(String name,int id){
    this.name = name;
    this.imgId = id;
}

public String getName(){
    return name;
}

public int getImgId(){
    return imgId;
}
}

3、實現(xiàn)ItemAdapter 繼承自ArrayAdapter

public class ItemAdapter extends ArrayAdapter<Item> {

private int layoutId;

public ItemAdapter(Context context, int layoutId, List<Item> list){
    super(context,layoutId,list);
    this.layoutId = layoutId;
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent){
    Item item = getItem(position);
    View view = LayoutInflater.from(getContext()).inflate(layoutId,parent,false);
    ImageView imageView = (ImageView)view.findViewById(R.id.item_img);
    TextView textView = (TextView) view.findViewById(R.id.item_text);
    imageView.setImageResource(item.getImgId());
    textView.setText(item.getName());


    return view;
}

}

4、實現(xiàn)自定義item界面 layout

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
    android:id="@+id/item_img"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" />

<TextView
    android:id="@+id/item_text"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:layout_marginRight="10dp"
    />

</LinearLayout>

5、關聯(lián) listView -listItem- ItemAdapter - listData

private List<Item> list = new ArrayList <Item>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initList();

    ItemAdapter itemAdapter = new ItemAdapter(MainActivity.this,R.layout.linear_item_layout,list);
    ListView listView = (ListView)findViewById(R.id.listview);
    listView.setAdapter(itemAdapter);
}


private void initList(){
    for (int i = 0; i <100 ; i++) {
        Item item = new Item("Item" + i,R.mipmap.ic_launcher);
        list.add(item);
    }
}

問題點備注:

  1. 自定義ItemAdapter繼承ArrayAdapter,需要實現(xiàn)構造方法和getView

2、getView中LayoutInflater和inflate

實際開發(fā)中LayoutInflater它的作用類似于findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml布局文件,并且實例化;而findViewById()是找xml布局文件下的具體widget控件(如 Button、TextView等)。

具體作用:
2.1、對于一個沒有被載入或者想要動態(tài)載入的界面,都需要使用LayoutInflater.inflate()來載入;
2.2、對于一個已經(jīng)載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
LayoutInflater 是一個抽象類, 獲得 LayoutInflater 實例的三種方式:

  1. LayoutInflater inflater = getLayoutInflater(); //調用Activity的getLayoutInflater()
  2. LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  3. LayoutInflater inflater = LayoutInflater.from(context);

2.3 、inflate 方法
通過 sdk 的 api 文檔,可以知道該方法有以下幾種過載形式,返回值均是 View 對象,如下:

 public View inflate (int resource, ViewGroup root)    
 public View inflate (XmlPullParser parser, ViewGroup root)    
 public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)    
 public View inflate (int resource, ViewGroup root, boolean attachToRoot)   

1:
public View inflate (int resource, ViewGroup root)
reSource:View的layout的ID
root:如果為null,則將此View作為根,此時既可以應用此View中的其他控件了。
如果!null, 則將默認的layout作為View的根。
2:
public View inflate ( XmlPullParser parser, ViewGroup root)
parser:你需要解析xml的解析接口
root:如果null,則將此View作為根,此時既可以應用此View中的其他控件了。
如果!null, 則將默認的layout作為View的根。
3:
public View inflate ( XmlPullParser parser, ViewGroup root, boolean attachToRoot)
parser:你需要解析View的xml的解析接口
root:如果null,則將此View作為根,此時既可以應用此View中的其他控件了。
如果!null, 則將默認的layout作為View的根。
attachToRoot:
ture:也就將此解析的xml作為View根
fase:則為默認的xml,做為根視圖View
4:
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
resource:View的layout的ID
root:如果null,則將此View作為根,此時既可以應用此View中的其他控件了。
如果!null, 則將默認的layout作為View的根。
attachToRoot:
ture:也就將此解析的xml作為View根
fase:則為默認的xml,做為根視圖View

更深層次的目前還理解不到。

參考文檔:https://blog.csdn.net/robertcpp/article/details/51523218

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容