ListView 항목의 다중 레이아웃 구현
이 섹션 소개:
이 섹션은 ListView 섹션의 마지막 섹션으로 ListView 다중 레이아웃 항목을 구현합니다. ListView 항목 다중 레이아웃이란 무엇입니까? 예를 들어 QQ 채팅 목록:
ListView로 만든 경우 하나의 ListView에 두 개의 다른 항목이 있습니다! 하나는 왼쪽, 하나는 오른쪽입니다. 이 섹션에서는 ListView의 여러 레이아웃을 구현하는 방법을 설명합니다!
1. 핵심 사항:
View가 어떤 카테고리에 해당하는지 getItemViewType() 메서드를 다시 작성하고 getViewTypeCount() 메서드가 반환됩니다. 총 몇 개의 카테고리가 있나요? 그런 다음 getView에서 getItemViewType을 호출하여 해당 카테고리를 얻은 다음 해당 뷰를 로드하세요!
2. 코드 구현:
여기서는 이전 섹션의 두 레이아웃을 직접 사용한 다음 다른 어댑터를 작성하여 여러 핵심 사항을 다시 작성합니다.
MutiLayoutAdapter.java:
* 2015년 9월 23일 0023에 Jay가 작성함.
*/
public class MutiLayoutAdapter는 BaseAdapter를 확장합니다.{
//두 개의 범주 플래그 정의
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private Context mContext;
private ArrayList<Object> mData = null;
public MutiLayoutAdapter(Context mContext,ArrayList<Object> mData) {
this.mContext = mContext;
this.mData = mData;
} }
@Override
public int getCount( ) {T Return mdata.size ();
}@@v Public Object GetItem (int Position) {
Return mdata.get (posity); getitemid (int position) {
return position;
}
//핵심 멀티 레이아웃의 경우 다음을 통해 카테고리를 판단합니다.
@Override
public int getItemViewType(int position) {
if (mData.get(position) instanceof App) {
return TYPE_APP;
} else if (mData.get(position) 도서 인스턴스) {
~
//범주 수
@Override
public int getViewTypeCount() {
return 2;
}
@Override
공개 View getView(int position, View convertView, ViewGroup 상위) {
int type = getItemViewType(position);
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
if(convertView == null){
스위치(유형){ ㅋㅋㅋ se);
holder1.img_icon = (ImageView) convertView.findViewById(R.id .img_icon);
holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_aname);
convertView.setTag(R.id.Tag_APP,holder1);
break;
케이스 TYPE_BOOK:
holder2 = 새 ViewHolder2( );
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);
holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_b 이름);
holder2.txt_bauthor = ( TextView) convertView.findViewById(R.id.txt_bauthor);
convertView.setTag(R.id.Tag_Book,holder2);
break;
}
}else{
스위치(유형){
case TYPE_APP:
holder1 = (ViewHolder1) 변환 View.getTag(R.id.Tag_APP);
break;
case TYPE_BOOK:
holder2 = (ViewHolder2) convertView. getTag(R.id.Tag_Book);
break;
}
}
Object obj = mData.get(position);
//下控件的值
스위치(유형){
케이스 TYPE_APP:
App app = (앱) obj;
if(app != null){
holder1.img_icon.setImageResource(app.getaIcon());
holder1.txt_aname.setText(app. getaName());
}
break;
케이스 TYPE_BOOK :
책 책 = (도서) obj;
if(book != null){
holder2.txt_bname.setText(book.getbName()); }
> ... title(R.id.Tag_APP,holder1); setTag(Object), 이것은 setTag의 오버로드된 메소드이며, 매개변수는 고유 키와 그 뒤의 객체입니다! 오직! ! ! 처음에는 TYPE_BOOK을 첫 번째 매개변수로 직접 사용하다가 다음 오류를 보고했습니다.
키는 애플리케이션별 리소스 ID여야 합니다
즉, 이전 키는 고유해야 하며, int 유형의 최종 변수를 정의하고 값을 하드 코딩하면 작동하지 않습니다. 여기서 접근 방식은 strings.xml에 직접 추가하는 것입니다.
<item name="Tag_APP" type="id"></item>
<item name="Tag_Book" type="id" ></item>
물론 res/values/ 아래에 다른 ids.xml 파일을 만들고 위 코드를 붙여넣을 수도 있습니다! 이 외에도 또 다른 주의할 점이 있습니다. 즉, 범주를 구분하는 기호는 0부터 시작해야 하며, 그렇지 않으면 다음과 같이 보고됩니다. 이와 같은 오류
MainActivity.java:
private static final int TYPE_BOOK= 0;
private static final int TYPE_APP = 1;
private ListView list_content;
private ArrayList<Object> mData = null;
private MutiLayoutAdapter myAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_main);
//数据准备:
mData = new ArrayList<Object>();
for(int i = 0;i < 20;i++){
스위치((int)(Math.random() * 2)){
케이스 TYPE_BOOK:
mData. add(new Book("第一行代码"","郭霖")));
break;
case TYPE_APP:
mData.add(new App(R.mipmap. iv_icon_baidu,"百島"));
break ;
}
}
list_content = (ListView) findViewById(R.id.list_content);
myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);
list_content.setAdapter(myAdapter);
}
}
위에서는 0과 1을 무작위로 생성하고, 0은 컬렉션에 Book 개체를 추가하고, 1은 App 개체를 추가합니다!
3. 코드 다운로드:
ListViewDemo6.zip
이 섹션 요약:
좋습니다. 이 섹션에서는 두 가지 방법을 다시 작성하는 ListView 항목 다중 레이아웃의 구현을 설명합니다. 그런 다음 getView()가 판단하고 다양한 레이아웃을 설정합니다~코드는 매우 간단합니다~
이것으로 ListView에 대한 지식은 끝났습니다. 물론 ListView에 대한 지식은 이에 국한되지 않습니다. 비동기 로딩, 최적화 등은 고급편에서 배워보겠습니다~ 이상입니다 감사합니다~