天天看點

ListView用例配合ViewHolder緩存

用android studio 在android 7中運作的 

由UIActivityt 和 listview_layout.xml 和 list_item.xml寫出來ListView用例

UIActivityt 代碼

package com.example.a20200712;

import android.database.DataSetObserver;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UIActivity extends AppCompatActivity {

    private ListView listview = null;
    private List<Map<String,Object>> list = null;
    private BaseAdapter ba = null;
    /**
     * 原資料
     */
    public void init() {
        list = new ArrayList<Map<String,Object>>(3);

        for(int i = 1 ;i < 50;i++){
            Map<String,Object> map1 = new HashMap<String,Object>();
            map1.put("img" ,R.drawable.kf);
            map1.put("head","第"+i+"張");
            map1.put("txt","數字"+i+i+i+i+i);
            map1.put("id",Long.valueOf(i));
            list.add(map1);
        }

    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_layout);
        init();
        showListView();
    }


    public void showListView() {
        listview = findViewById(R.id.layout_listView);
        ba = new BaseAdapter() {
            //擷取清單總條數
            @Override
            public int getCount() {
                return list.size();
            }

            //擷取對應的list單個對象 在單擊事件中傳回對應的對象資訊
            @Override
            public Object getItem(int position) {
                return list.get(position);
            }
            //表列對應資料的id 盡量不要直接使用 position 動态清單在某些場景下會出錯
            @Override
            public long getItemId(int position) {
                return (Long) list.get(position).get("id");
            }

            //組裝每一條list行 視圖
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder = null;
                TextView id = null;
                ImageView iv = null;
                TextView head = null;
                TextView txt = null;

                if(convertView == null){
                    convertView = View.inflate(UIActivity.this,R.layout.list_item,null);
                    viewHolder = new ViewHolder();

                    id = convertView.findViewById(R.id.layout_list_item_id);
                    iv = convertView.findViewById(R.id.layout_list_item_img);
                    head = convertView.findViewById(R.id.layout_list_item_head);
                    txt = convertView.findViewById(R.id.layout_list_item_txt);
                    viewHolder.setIdV(id);
                    viewHolder.setImV(iv);
                    viewHolder.setHeadV(head);
                    viewHolder.setTxtV(txt);

                    //内容的點選事件
                    txt.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Log.i("mw","文字-事件被觸發了"+position);
                            Map<String,Object> currentMap = (Map<String,Object>) list.get(position);
                            list.remove(currentMap);
                            ba.notifyDataSetChanged();
                        }
                    });
                    //圖處點選事件
                    iv.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Log.i("mw","圖檔-事件被觸發了"+position);
                            Map<String,Object> currentMap = (Map<String,Object>) list.get(position);
                            currentMap.put("head","修改後的資料"+(String)currentMap.get("head"));
                            ba.notifyDataSetChanged();
                        }
                    });
                    convertView.setTag(viewHolder);
                }else{
                    viewHolder = (ViewHolder)convertView.getTag();
                     id = viewHolder.getIdV();
                     iv = viewHolder.getImV();
                     head = viewHolder.getHeadV();
                     txt = viewHolder.getTxtV();
                }

                id.setText(String.valueOf(list.get(position).get("id")));
                iv.setImageResource((Integer) list.get(position).get("img"));
                head.setText((String)list.get(position).get("head"));
                txt.setText((String)list.get(position).get("txt"));

                return convertView;
            }
        };
        listview.setAdapter(ba);


        //添加點選事件====對整行添加事件
      /*  listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Map<String,Object> currentMap = (Map<String,Object>) adapterView.getItemAtPosition(i);
               //Toast.makeText(getApplicationContext(), (String)currentMap.get("head"), Toast.LENGTH_SHORT).show();
                currentMap.put("head","修改後的資料"+(String)currentMap.get("head"));
                ba.notifyDataSetChanged();// 通知修改資料
            }
        });*/
    }

/*    public void delImgOnclick(View view){
       Log.i("mw","單個圖檔事件被觸發了");
       Map map =  list.get(list.size()-1);
        list.remove(map);
       // Toast.makeText(getApplicationContext(),  String.valueOf(view.getId()), Toast.LENGTH_SHORT).show();
        ba.notifyDataSetChanged();// 通知修改資料
    }*/

    public class ViewHolder{
        private TextView idV;
        private ImageView imV;
        private TextView headV;
        private TextView txtV;

        public TextView getIdV() {
            return idV;
        }

        public void setIdV(TextView idV) {
            this.idV = idV;
        }

        public ImageView getImV() {
            return imV;
        }

        public void setImV(ImageView imV) {
            this.imV = imV;
        }

        public TextView getHeadV() {
            return headV;
        }

        public void setHeadV(TextView headV) {
            this.headV = headV;
        }

        public TextView getTxtV() {
            return txtV;
        }

        public void setTxtV(TextView txtV) {
            this.txtV = txtV;
        }
    }
}
           

listview_layout.xml 代碼

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

list_item.xml 代碼

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


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        android:id="@+id/layout_list_item_id"></TextView>

    <ImageView
        android:id="@+id/layout_list_item_img"
        android:layout_width="wrap_content"
        android:layout_height="130dp"
        tools:srcCompat="@tools:sample/avatars"
        />

    <TextView
        android:id="@+id/layout_list_item_head"
        android:layout_width="283dp"
        android:layout_height="65dp"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="0dp"
        android:textSize="30dp"
        android:layout_toRightOf="@+id/layout_list_item_img"
        android:text="TextView" />

    <TextView
        android:id="@+id/layout_list_item_txt"
        android:layout_width="match_parent"
        android:textSize="30dp"
        android:layout_alignParentEnd="true"
        android:layout_below="@+id/layout_list_item_head"
        android:layout_toRightOf="@+id/layout_list_item_img"
        android:layout_height="65dp"
        android:text="TextView" />


</RelativeLayout>
           

在 android 7上運作

ListView用例配合ViewHolder緩存