您的位置:

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));
    }
}