Android ListView控件詳解

一、Android ListView控件的用法

ListView是Android開發中最常用的控件之一,它能夠在屏幕上展示一列數據,非常適合用於列表或者網格等展示數據的場景。下面我們將從ListView的基本用法、自定義Adapter、點擊事件監聽器、長按事件監聽器等多個方面進行詳細闡述。

1. ListView的基本用法

ListView的基本使用非常簡單,只需兩步:

<ListView
    android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
    
listView = findViewById(R.id.list_view);
listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, data));

第一步:在布局文件中定義ListView控件

第二步:在代碼中為ListView設置Adapter

2. 自定義Adapter

雖然ArrayAdapter可以滿足ListView一般的需求,但在實際開發中,我們通常需要實現自己的Adapter來滿足更複雜的需求。
自定義Adapter需要繼承自BaseAdapter,實現四個方法:getCount、getItem、getItemId和getView。其中getView方法是最重要的,它決定了ListView中每一項的具體展示。

public class MyAdapter extends BaseAdapter {

    private List mData;
    private LayoutInflater mLayoutInflater;

    public MyAdapter(Context context, List data) {
        mData = data;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.item_layout, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.textView = convertView.findViewById(R.id.text_view);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.textView.setText(mData.get(position));
        return convertView;
    }

    static class ViewHolder {
        TextView textView;
    }
}

3. 點擊事件監聽器

為ListView的每一項設置點擊事件監聽器非常簡單。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        Toast.makeText(MainActivity.this, "You clicked item " + position, Toast.LENGTH_SHORT).show();
    }
});

4. 長按事件監聽器

為ListView的每一項設置長按事件監聽器同樣非常簡單。

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
        Toast.makeText(MainActivity.this, "You long clicked item " + position, Toast.LENGTH_SHORT).show();
        return true;
    }
});

二、Android ListView傳值

有時候需要在ListView中點擊某一項時傳遞一些參數到下一個Activity中,這時可以使用Bundle來傳遞數據。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        Intent intent = new Intent(MainActivity.this, DetailActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("data", data.get(position));
        intent.putExtras(bundle);
        startActivity(intent);
    }
});

三、Android ListView放大縮小

有時候需要讓用戶手動放大縮小ListView,下面給出兩種方法。

1. 設置列表項的高度

在ListView的Adapter中實現getItemViewType和getViewTypeCount方法,並在getView方法中根據需要改變列表項的高度即可。

@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return TYPE_HEADER;
    } else {
        return TYPE_NORMAL;
    }
}

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (getItemViewType(position) == TYPE_HEADER) {
        // header item
        ...
    } else {
        // normal item
        convertView.setLayoutParams(new AbsListView.LayoutParams(
                AbsListView.LayoutParams.MATCH_PARENT, mItemHeight));
        ...
    }
}

2. 使用setScaleX和setScaleY方法縮放

在Activity的onCreate方法中設置ListView的transformPivotX和transformPivotY坐標,並通過點擊事件設置setScaleX和setScaleY來實現放大縮小。

listView = findViewById(R.id.list_view);
listView.setPivotX(0);
listView.setPivotY(0);

// 放大
listView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        listView.animate().scaleX(2f).scaleY(2f).setDuration(500).start();
    }
});

// 縮小
listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        listView.animate().scaleX(1f).scaleY(1f).setDuration(500).start();
        return true;
    }
});

四、Android ListView分頁加載的原理

實現ListView的分頁加載通常需要配合後台服務來完成,下面介紹分頁加載的原理:

1. 後台服務根據請求參數和當前頁數,返回對應的數據。

2. 在前台Activity的ListView的Adapter中保存當前已經加載的數據,以及當前頁碼。

3. 當ListView滑動到底部時,向後台服務請求下一頁數據,並將新的數據添加到已有數據的末尾。

4. 為了防止連續請求重複數據,可以設置一個isLoading的標誌位,在加載完數據後將其設置為false。

五、ListView控件和android ListView

ListView控件是Android提供的一種展示數據的控件,而android ListView是ListView控件在Android平台下的具體實現。

如果你需要在Android應用中展示一列數據,ListView控件是常用的選擇,而android ListView是ListView的具體應用,提供了非常豐富的功能和API供開發者使用。

六、安卓ListView控件的用法

安卓ListView控件的用法與ListView控件基本相同,下面給出一個完整的示例代碼:

<?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">

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

</LinearLayout>

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private List data;

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

        initData();
        initListView();
    }

    private void initData() {
        data = new ArrayList();
        for (int i = 0; i < 100; i++) {
            data.add("Item " + i);
        }
    }

    private void initListView() {
        listView = findViewById(R.id.list_view);
        listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, data));
    }
}

七、Android ListView控件詳解完整代碼示例

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private List data;

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

        initData();
        initListView();

        // 點擊事件監聽器
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "You clicked item " + position, Toast.LENGTH_SHORT).show();
            }
        });

        // 長按事件監聽器
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "You long clicked item " + position, Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        // 放大
        listView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listView.animate().scaleX(2f).scaleY(2f).setDuration(500).start();
            }
        });

        // 縮小
        listView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                listView.animate().scaleX(1f).scaleY(1f).setDuration(500).start();
                return true;
            }
        });
    }

    private void initData() {
        data = new ArrayList();
        for (int i = 0; i < 100; i++) {
            data.add("Item " + i);
        }
    }

    private void initListView() {
        listView = findViewById(R.id.list_view);
        listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, data));
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/154813.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-16 14:14
下一篇 2024-11-16 14:14

相關推薦

  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控件。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Python ttk控件用法介紹

    本文將從多個方面對Python ttk控件進行詳細闡述,旨在幫助開發者更好的使用和理解這一控件。 一、ttk控件概述 ttk控件是Python tkinter模塊中的一個擴展模塊,…

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Android Java Utils 可以如何提高你的開發效率

    Android Java Utils 是一款提供了一系列方便實用的工具類的 Java 庫,可以幫助開發者更加高效地進行 Android 開發,提高開發效率。本文將從以下幾個方面對 …

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論