ListView的用法和滚动条用法

本文详细介绍了如何在Android应用中布局和使用ListView组件,包括配置分割线、条目布局、自定义适配器及条目点击监听等核心内容。

ListView 是手机系统上应用非常非常广泛的一种组件,它以垂直列表的形式显示所有列表项。

一、怎样去布局ListView

ListView额外提供如图以下的xml属性:



android:divider="#000"设置分割条为纯黑色

android:dividerHeight="3sp" 设置分割条高度为3dp

android:divider="@drawable/news_test1" 设置分割条为图片news_test1 

android:entries="@array/books" 指定books列表数组,还需在应用中定义一个名为books的数组,一般是提供Adapter


布局ListView的一个条目item的布局:当布局好ListView之后,可以根据需要对每个条目进行布局,以新闻的条目为例如下:




    

    

        

        
    
	
条目中的初始数据可以假设初设定。当代码进行操作后,会产生如下布局:

在条目上分别设有图片、新闻题目、新闻内容简介。

二、代码组成和适配器Adapter
先看下代码:
package com.itheima.news_listview.adapter;

import java.util.ArrayList;

import com.itheima.news_listview.R;
import com.itheima.news_listview.bean.NewsBean;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class NewsAdapter extends BaseAdapter {
	
	private ArrayList list;
	private Context context;

	public NewsAdapter(Context context,ArrayList list){
		this.list = list;
		this.context = context;
	}

	@Override
	public int getCount() {
		return list == null?0:list.size();
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Log.i("TAG", "$$$$$$$$$$$$"+position);
		View view = null;
		if(convertView != null){
			view = convertView;
		}else {
			LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			view = layoutInflater.inflate(R.layout.item_news_layout, null);
			
		}
		//获取子控件的对象
		ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);
		TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);
		TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);
//		获取postion位置的对应list集合中的新闻数据
		NewsBean newsBean = list.get(position);
		//设置标题
		item_tv_title.setText(newsBean.title);
		//设置内容
		item_tv_des.setText(newsBean.des);
		
		item_img_icon.setImageDrawable(newsBean.icon);
		
		return view;
	}

}

先讲ListView和Adapter怎样工作的:
每当有一个条目暴露在屏幕下,adapter适配器就会为这个条目创建出item布局。每次滑动就会把新暴露出来的条目进行加载。在代码中添加的打印:Log.i("TAG", "$$$$$$$$$$$$创建的条目个数为:"+position);如果当前代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
		Log.i("TAG", "$$$$$$$$$$$$创建的条目个数为:"+position);
		View view = null;
//		if(convertView != null){
//			view = convertView;
//		}else {
			LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			view = layoutInflater.inflate(R.layout.item_news_layout, null);
			
		//}
		//获取子控件的对象
		ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);
		TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);
		TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);
//		获取postion位置的对应list集合中的新闻数据
		NewsBean newsBean = list.get(position);
		//设置标题
		item_tv_title.setText(newsBean.title);
		//设置内容
		item_tv_des.setText(newsBean.des);
		
		item_img_icon.setImageDrawable(newsBean.icon);
		
		return view;
	}
}
当滑动ListView时,LogCat的反馈应用信息如下:

创建太多的条目,占用运行资源。但是,如果有1万条条目时,不可能去全部加载出来。故会添加一个判断,复用已经完全消失在屏幕的条目进行复用,只会产生屏幕显示的条目个数+1(头一个没有完成消失,新暴露出来的已经加载,固此处要+1),代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
		Log.i("TAG", "$$$$$$$$$$$$创建的条目个数为:" + position);
		View view = null;
		if (convertView != null) {
			view = convertView;
		} else {
			LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			view = layoutInflater.inflate(R.layout.item_news_layout, null);

		}
		// 获取子控件的对象
		ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);
		TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);
		TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);
		// 获取postion位置的对应list集合中的新闻数据
		NewsBean newsBean = list.get(position);
		// 设置标题
		item_tv_title.setText(newsBean.title);
		// 设置内容
		item_tv_des.setText(newsBean.des);

		item_img_icon.setImageDrawable(newsBean.icon);

		return view;
	}
}
这样会把复用view=converView。

BaseAdapter的四个方法实现:
适配器的使用必须要实现4个方法,现在分别介绍4个方法的代表含义:

public int getCount() {
return list == null ? 0 : list.size();
}
有多少个项目放在适配器的数据中。返回一个int类型的数,此处返回一个数字的个数,但要用三目算法判断下数字是否为空。必须要判断下。

public Object getItem(int position) {
return list.get(position);
}
得到相关的数据项的指定位置的数据集,一般指对象数组的元素内容。返回一个Obj类型,此次数组存放的为对象

public long getItemId(int position) {
return position;
}
得到相关的行id列表中指定的位置 指item的id  返回一个long型

public View getView(int position, View convertView, ViewGroup parent) {
//得到一个视图显示数据集的数据在指定的位置。你可以手动创建一个视图或指定XML布局文件。
返回一个View布局的展示,这里要设置引入布局的各项参数

View view = null;
if (convertView != null) {
view = convertView;
//复用convertView
} else {
LayoutInflater layoutInflater = (LayoutInflater)                                  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.item_news_layout, null);
//引用自己设定的xml布局格式
}
// 获取子控件的对象
ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);
//拿到图片
TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);
//拿到新闻内容
TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);
//拿到新闻题目
// 获取postion位置的对应list集合中的新闻数据
NewsBean newsBean = list.get(position);
// 设置标题
item_tv_title.setText(newsBean.title);
// 设置内容
item_tv_des.setText(newsBean.des);
// 设置图片
item_img_icon.setImageDrawable(newsBean.icon);
//显示当前条目内容
return view;
}
4个方法是关键,大部分是固定格式。

创建适配器和条目的点击监控:
先看主方法的代码:
package com.itheima.news_listview;

import java.util.ArrayList;

import com.itheima.news_listview.adapter.NewsAdapter;
import com.itheima.news_listview.bean.NewsBean;
import com.itheima.news_listview.utils.NewsUtils;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity implements OnItemClickListener {

	private Context mContext;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext = this;
		//找到控件
		ListView lv_news = (ListView) findViewById(R.id.lv_news);
		ArrayList allNews = NewsUtils.getAllNews(mContext);
		//创建适配器adapter,把当前上下文和新闻资源传递
		NewsAdapter newsAdapter = new NewsAdapter(mContext, allNews);
		lv_news.setAdapter(newsAdapter);
//		设置条目的点击事件
		lv_news.setOnItemClickListener(this);				
	}
	@Override
	public void onItemClick(AdapterView parent, View view, int position,
			long id) {
		
		NewsBean bean = (NewsBean) parent.getItemAtPosition(position);
		
		String url = bean.news_url;
		
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);
		intent.setData(Uri.parse(url));
		startActivity(intent);
	}
}
监控方法中有监控条目的方法,直接使用就行:
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
点击后需要执行的操作
}

滚动条的用法和属性:

当文字很多时View的高度不能超过一个固定的值,无法满足需求,因为ScrollView没有maxHeight,所以要了解其用法。
虽然Textview里面有方法可以实现该功能。如下:
    <TextView
    android:id="@+id/text_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:maxLines="10"
    android:scrollbars="vertical"/>
但还有在java中设定:
TextView textView = (TextView)findViewById(R.id.text_view);
textView.setMovementMethod(ScrollingMovementMethod.getInstance());

上述方法需要在两个部分设定,过于麻烦,现在可以直接用ScrollView来实现滚动:代码如下:
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_source"/>
</ScrollView>

也可以设定在横向的滚动HorizontalScrollView 代码如下

<HorizontalScrollView
        
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >       
      <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_source"/>
     </HorizontalScrollView>

也可以同时使用,外面套一层垂直的ScrollView就行,代码如下:
 <ScrollView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    <HorizontalScrollView
        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        
        <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_source"/>
     </HorizontalScrollView>
    </ScrollView>

总结:需要掌握Adapter的4个方法,和设置item的点击事件。
学会布局ListView 和item的布局





<think>首先,用户的问题是关于WinForm中ListView控件的使用方法。用户说:"我想查找winform中listview控件的使用方法 请问winform中listview控件的使用方法"。所以,我需要基于提供的引用之前的系统指令来回答。 回顾系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$$$$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了三个引用: - 引用[1]:关于ListView控件的SelectionMode属性,解释MultiSimpleMultiExtended的区别。 - 引用[2]:展示如何添加项到ListView控件。 - 引用[3]:展示如何添加带有子项的项到ListView,并设置滚动条。 用户说这些引用仅供参考,不是真正的需求,我需要参考用户上一次的问题我的回答。但在这个对话中,这是用户的第一条消息,所以没有上一次的问题。用户提到"参考用户上一次的问题",但在这个上下文中,可能是个误解;我应该基于当前消息。 用户真正的需求是了解WinForm中ListView控件的使用方法。所以,我需要提供一个全面的回答,覆盖基本用法,基于引用一般知识。 结构化我的回答: 1. **介绍ListView控件**:简要说明它的作用常见用途。 2. **基本属性**:如View属性(设置显示视图)。 3. **添加项**:使用Items.Add方法,如何创建ListViewItem。 4. **子项处理**:添加子项。 5. **选择模式**:解释SelectionMode属性。 6. **其他常用操作**:如滚动条设置(如引用[3])。 7. **代码示例**:提供简单的代码片段来演示添加项。 8. **生成相关问题**:在回答结束时添加相关问题。 确保回答清晰、帮助用户逐步解决问题。既然是中文回答,所有内容都用中文。 关键点来自引用: - 添加项:引用[2][3]展示了如何添加子项。 - 选择模式:引用[1]区分了MultiSimpleMultiExtended。 - 滚动条:引用[3]提到设置TopItem来自动滚动。 我的回答应该整合这些。 最终,添加相关问题。 回答结构: - 开头解释ListView控件。 - 分步骤解释使用方法。 - 提供代码示例。 - 结束时添加相关问题。 </think>### WinForm中ListView控件的使用方法 WinForm中的ListView控件是一个强大的列表视图组件,用于显示数据项目集合。它常用于展示表格数据、文件列表、日志记录等场景。以下是详细的步骤来使用ListView控件,包括属性设置、添加项、选择模式常见操作。我将基于标准WinForm知识进行解释,并参考您提供的引用信息来确保回答可靠[^1][^2][^3]。 #### 1. **ListView的基本设置** - **添加控件到窗体**: - 在Visual Studio的设计视图中,从工具箱拖拽ListView控件到窗体上。 - 关键属性设置: - **View属性**:决定显示样式,如Details(表格视图)、List(列表视图)、Tile(平铺视图)或LargeIcon/SmallIcon(图标视图)。默认是LargeIcon。 - **Columns属性**:如果使用Details视图,需要添加列标题。例如: ```csharp listView1.View = View.Details; listView1.Columns.Add("时间", 100); // 列名宽度 listView1.Columns.Add("事件", 200); ``` - **FullRowSelect属性**:设置为`true`可以使整行被选中(适用于Details视图)。 - **选择模式(SelectionMode)**: - 在属性窗口中设置SelectionMode: - **MultiSimple**:多选时,鼠标点击项目即可选中或取消选中(无需额外按键)。 - **MultiExtended**:多选时需要借助Ctrl键(选择单个)或Shift键(连续选择)。 - 其他选项:One(单选)None(不可选)。 - 参考引用[1],MultiSimpleMultiExtended的区别在于鼠标操作:MultiSimple点击后保持选中状态,除非再次点击取消;MultiExtended需要按键辅助[^1]。 #### 2. **添加子项** - **创建ListViewItem**:每个ListViewItem代表一行数据。您可以添加文本、图像等。 - 基本添加方法:使用`Items.Add`方法。 ```csharp ListViewItem item = new ListViewItem("主项文本"); // 主项文本对应第一列 item.SubItems.Add("子项1"); // 添加子项到第二列 item.SubItems.Add("子项2"); // 添加子项到第三列 listView1.Items.Add(item); ``` - 参考引用[2],可以直接通过数组添加: ```csharp listView1.Items.Add(new ListViewItem(new string[] { "文本1", "文本2", "文本3" }, 0)); // 0为图像索引 ``` - **动态添加日志或数据**:结合DateTime等类,实现实时数据展示。 - 参考引用[3],添加时间戳并自动滚动: ```csharp string time = DateTime.Now.ToString("HH:mm:ss"); ListViewItem lvi = new ListViewItem(time); lvi.SubItems.Add("试验开始"); listViewLog.Items.Add(lvi); listViewLog.TopItem = lvi; // 设置滚动条自动滚动至底部 ``` #### 3. **常见操作事件处理** - **读取选中项**:通过SelectedItems集合获取用户选择的项目。 ```csharp foreach (ListViewItem selectedItem in listView1.SelectedItems) { string text = selectedItem.Text; // 获取主项文本 string subText = selectedItem.SubItems[1].Text; // 获取子项文本 } ``` - **事件处理**: - `ItemSelectionChanged`:当选中状态变化时触发。 - `DoubleClick`:用户双击项目时触发。 - 示例:双击弹出消息框。 ```csharp listView1.DoubleClick += (sender, e) => { if (listView1.SelectedItems.Count > 0) { MessageBox.Show("选中项: " + listView1.SelectedItems[0].Text); } }; ``` - **优化性能**:大量数据时,使用BeginUpdateEndUpdate防止刷新闪烁。 ```csharp listView1.BeginUpdate(); // 添加多个项... listView1.EndUpdate(); ``` #### 4. **完整代码示例** 以下是一个简单示例,展示如何添加到窗体并显示数据: ```csharp // 在窗体加载事件中设置 private void Form1_Load(object sender, EventArgs e) { // 设置视图listView1.View = View.Details; listView1.Columns.Add("ID", 50); listView1.Columns.Add("名称", 100); listView1.Columns.Add("描述", 200); // 添加示例项 listView1.Items.Add(new ListViewItem(new string[] { "1", "项目A", "这是一个测试" })); listView1.Items.Add(new ListViewItem(new string[] { "2", "项目B", "另一个测试" })); // 设置滚动条(可选) listView1.Items[listView1.Items.Count - 1].EnsureVisible(); // 确保最后一项可见 } ``` #### 注意事项 - **数据绑定**:对于复杂数据,建议使用DataBinding(如绑定到数据源),但ListView本身不支持直接绑定,需手动填充。 - **性能考虑**:添加大量项目时,优先使用BeginUpdate/EndUpdate以避免界面卡顿。 - **参考建议**:如果需要更高级功能,查阅微软官方文档或WinForm教程。 通过以上步骤,您就能高效使用ListView控件来管理数据展示交互。如果有具体场景问题,可以提供更多细节以进一步优化解答[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值