1. 程式人生 > >ListView載入不同的條目

ListView載入不同的條目

首先,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 
DataBean { //型別資料 public int type; //文字資料 public String text; //圖片資料 public int images; @Override public String toString() { return "DataBan{" + "type=" + type + ", text='" + text + '\'' + ", images=" + images + '}'; } }
//這裡toString供後面列印使用  可以不用寫

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裡