ListView載入不同的條目
阿新 • • 發佈:2019-01-06
首先,ListView我們平時用的都比較多,以往的開發中用的也不叫多;
以前一直都是載入一樣的佈局一樣的條目。
現在載入不同佈局的條目:
這裡用的資料是自定義的(有的需要在網上獲取)
1.建立ListView佈局(後面的item佈局需要根據自定義資料的需求來新增)
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView"></ListView>2.建立JavaBean類,寫入自定義屬性 (注意:裡面需要多寫一個型別的屬性 及 Type)
public class//這裡toString供後面列印使用 可以不用寫DataBean { //型別資料 public int type; //文字資料 public String text; //圖片資料 public int images; @Override public String toString() { return "DataBan{" + "type=" + type + ", text='" + text + '\'' + ", images=" + images + '}'; } }
3.在MainActivity中寫入程式碼
public class MainActivity extends AppCompatActivity {
//設定三種類型 來設定不同的item
private static final int FristType=1;
private static final int TwoType=2;
private static final int ThreeType=3;
//上面這些在Android studio中可以利用const自動生成//自定義資料 String[] texts = {"玉皇", "王母", "長蛾", "八戒", "如來", "易宸鋒", "守星者", "部長", "大師", "收藏家"}; private int[] images = {R.drawable.jx_left_listitem_1, R.drawable.jx_left_listitem_5, R.drawable.jx_left_listitem_2, R.drawable.jx_left_listitem_3, R.drawable.jx_left_listitem_4, R.drawable.jx_left_listitem_5, R.drawable.jx_left_listitem_6, R.drawable.jx_left_listitem_6, R.drawable.jx_left_listitem_4, R.drawable.jx_left_listitem_5};
//建立集合 private List<DataBean> list; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//控制元件
listView=(ListView)findViewById(R.id.listView);
//初始化資料
initData();
listView.setAdapter(new MyAdapter());
}
//初始化資料 下面打印出來有助於理解
private void initData() {
list=new ArrayList<>();
for (int i = 0; i < 10; i++) {
DataBean data=new DataBean();
//第一
if (i%2==0 ){
data.type=FristType;
data.text=texts[i];
Log.d("data","位置"+i+"裡的資料:"+data.toString());
//第二
}else if (i%3==0){
data.type=TwoType;
data.text=texts[i];
data.images=images[i];
Log.d("data","位置"+i+"裡的資料:"+data.toString());
//第三
}else {
data.type=ThreeType;
data.text=texts[i];
data.images=images[i];
Log.d("data","位置"+i+"裡的資料:"+data.toString());
}
list.add(data);
}
}
4.下面是介面卡(我寫的是內部類,上面設定介面卡的時候沒有傳參)
下面用到的佈局(有三種類型 就需要三個不同的item)
第一個:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv1"/> </LinearLayout>第二個:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv2"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv2"/> </LinearLayout>第三個:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv3"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv3"/> </LinearLayout>注意:第二個和第三個裡的佈局方向不同
//listView顯示不同條目的Adapter,比平常用的多了兩個方法
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
//表示有幾種型別的item,這裡有三種
@Override
public int getViewTypeCount() {
return 4;//這裡注意必須比上面定義的數要大
}
//返回ListView所載入的item的型別
@Override
public int getItemViewType(int position) {
return list.get(position).type;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder1 holder1=null;
ViewHolder2 holder2=null;
ViewHolder3 holder3=null;
int type = getItemViewType(position);
if (convertView==null){
//存值
switch (type){
case FristType:
holder1=new ViewHolder1();
convertView=View.inflate(MainActivity.this,R.layout.item,null);
holder1.tv1=(TextView) convertView.findViewById(R.id.tv1);
convertView.setTag(holder1);
break;
case TwoType:
holder2=new ViewHolder2();
convertView=View.inflate(MainActivity.this,R.layout.item2,null);
holder2.tv2=(TextView) convertView.findViewById(R.id.tv2);
holder2.iv2=(ImageView)convertView.findViewById(R.id.iv2);
convertView.setTag(holder2);
break;
case ThreeType:
holder3=new ViewHolder3();
convertView=View.inflate(MainActivity.this,R.layout.item3,null);
holder3.tv3=(TextView) convertView.findViewById(R.id.tv3);
holder3.iv3=(ImageView)convertView.findViewById(R.id.iv3);
convertView.setTag(holder3);
break;
}
}else {
//取值
switch (type){
case FristType:
holder1=(ViewHolder1) convertView.getTag();
break;
case TwoType:
holder2=(ViewHolder2) convertView.getTag();
break;
case ThreeType:
holder3=(ViewHolder3) convertView.getTag();
break;
}
}
//設定值
switch (type){
case FristType:
holder1.tv1.setText(list.get(position).text);
break;
case TwoType:
holder2.tv2.setText(list.get(position).text);
holder2.iv2.setImageResource(list.get(position).images);
break;
case ThreeType:
holder3.tv3.setText(list.get(position).text);
holder3.iv3.setImageResource(list.get(position).images);
break;
}
return convertView;
}
class ViewHolder1{
TextView tv1;
}
class ViewHolder2{
TextView tv2;
ImageView iv2;
}
class ViewHolder3{
TextView tv3;
ImageView iv3;
}
}
}
注:圖片檔案直接上傳在drawable裡