当前位置:首页 » 操作系统 » listview源码

listview源码

发布时间: 2022-05-30 03:01:34

① listview里边可以嵌套listview吗

要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView。但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题。上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的。
又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过试验发现是可以解决问题的,它的思路就是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了,以下是源码

public class Utility {
public static void (ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}

int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一个问题就是,子ScrollView中无法滑动的(如果它没有显示完全的话),因为滑动事件会被父ScrollView吃掉,如果想要让子ScrollView也可以滑动,只能强行截取滑动事件,有牛人在论坛中发过代码说可以。虽然我没有亲自试过,但估计是可行的。
虽然在ScrollView中显示ScrollView在技术上的难题可以攻破,但是这样的设计却是非常差的用户体验因为用户会不容易看到和操作子ScrollView中的内容。比如好的设计是,父ListView的每个Item只显示概括性的描述,然后点击其Item会进入另外一个页面来详细描述和展示以及对这个Item的操作。

② 求一个C#对数据库的增删改查代码和ListView的代码。

这段代码太实用了: using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;namespace T5
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
FillListView();
}
private void FillListView()
{
List<Student> list = GetStudents();
//填充listview
foreach (Student s in list)
{
//创建listviewitem对象
ListViewItem item = new ListViewItem(s.Id);
//给item其它三个列添加数据
item.SubItems.AddRange(new string[] {s.Name,s.Age,s.Address });
//将item对象添加到listview的items集合中
lstStudents.Items.Add(item);
}
} private List<Student> GetStudents()
{
//清空listview
lstStudents.Items.Clear();
//创建学生集合
List<Student> list = new List<Student>();
//创建xml文档对象
XmlDocument doc = new XmlDocument();
//加载文档内容
doc.Load("../../students.xml");
//获取根节点
//XmlNode root = doc.DocumentElement;
XmlNode root = doc.SelectSingleNode("students");
foreach (XmlNode stu in root.ChildNodes)
{
Student s = new Student();
//获取id属性的值
s.Id = stu.Attributes["id"].Value;
//不用循环的做法
s.Name = stu.ChildNodes[0].InnerText;
s.Age = stu.ChildNodes[1].InnerText;
s.Address = stu.ChildNodes[2].InnerText;
//用循环的做法
//foreach (XmlNode node in stu.ChildNodes)
//{
// switch (node.Name)
// {
// case "name":
// s.Name = node.InnerText;
// break;
// case "age":
// s.Age = node.InnerText;
// break;
// case "address":
// s.Address = node.InnerText;
// break;
// }
//}
//将学生对象添加到集合中
list.Add(s);
}
//返回学生集合
return list;
} //删除
private void button4_Click(object sender, EventArgs e)
{
if (lstStudents.SelectedItems.Count == 1)
{
XmlDocument doc = new XmlDocument();
doc.Load("../../students.xml");
XmlNode root = doc.DocumentElement;
foreach (XmlNode stu in root.ChildNodes)
{
if (stu.Attributes["id"].Value == lstStudents.SelectedItems[0].Text)
{
//删除选中的学生节点
root.RemoveChild(stu);
//更新xml文档
doc.Save("../../students.xml");
//刷新listview
FillListView();
MessageBox.Show("删除成功");
return;
}
}
MessageBox.Show("删除失败");
}
else
{
MessageBox.Show("请选中要删除的记录");
}
} private void lstStudents_SelectedIndexChanged(object sender, EventArgs e)
{
if (lstStudents.SelectedItems.Count == 1)
{
//将选中的记录各个字段的值显示到文本框中
txtId.Text = lstStudents.SelectedItems[0].Text;
txtName.Text = lstStudents.SelectedItems[0].SubItems[1].Text;
txtAge.Text = lstStudents.SelectedItems[0].SubItems[2].Text;
txtAddress.Text = lstStudents.SelectedItems[0].SubItems[3].Text;
}
} //修改
private void button3_Click(object sender, EventArgs e)
{
if (lstStudents.SelectedItems.Count == 1)
{
XmlDocument doc = new XmlDocument();
doc.Load("../../students.xml");
XmlNode root = doc.DocumentElement;
foreach (XmlNode stu in root.ChildNodes)
{
if (stu.Attributes["id"].Value == lstStudents.SelectedItems[0].Text)
{
//更新当前学生各个节点的innertext
stu.ChildNodes[0].InnerText = txtName.Text;
stu.ChildNodes[1].InnerText = txtAge.Text;
stu.ChildNodes[2].InnerText = txtAddress.Text; //更新xml文档
doc.Save("../../students.xml");
//刷新listview
FillListView();
MessageBox.Show("修改成功");
return;
}
}
MessageBox.Show("修改失败");
}
else
{
MessageBox.Show("请选中要修改的记录");
}
} //添加
private void button2_Click(object sender, EventArgs e)
{
//1.取出xml文件中最后一个学生的id
XmlDocument doc = new XmlDocument();
doc.Load("../../students.xml");
XmlNode root = doc.DocumentElement;
//通过计算字节点的个数来获取最后一个字节点对应的下标
//int index = root.ChildNodes.Count -1;
//string oldId = root.ChildNodes[index].Attributes["id"].Value;
//直接获取最后一个字节点的id
string oldId = root.LastChild.Attributes["id"].Value;
//2.得到新学生的id
string newId = Convert.ToString(int.Parse(oldId) + 1);
//3.创建各个节点和属性对象
//创建student节点对象
XmlElement student = doc.CreateElement("student");
//创建子节点对象
XmlNode name = doc.CreateElement("name");
XmlNode age = doc.CreateElement("age");
XmlNode address = doc.CreateElement("address");
//给字节点赋值
name.InnerText = txtName.Text;
age.InnerText = txtAge.Text;
address.InnerText = txtAddress.Text;
//创建id属性
XmlAttribute id = doc.CreateAttribute("id");
//给id属性赋值
id.Value = newId;
//建立节点之间的关系
student.AppendChild(name);
student.AppendChild(age);
student.AppendChild(address);
//将id属性添加到student节点下
student.Attributes.Append(id);
//将student节点追加到根节点下
root.AppendChild(student);
//保存
doc.Save("../../students.xml");
//刷新
FillListView();
MessageBox.Show("添加成功");
}
}
}

③ ListView 里面代码 C#

ListViewItem
lviStudent
=
new
ListViewItem((string)datareader"LoginId"]);//new一个ListViewItem
对象,后面是对象的值。
lvStudent.Items.Add(lviStudent);//向lvStudent控件添加节点
lviStudent.Tag
=
(int)datareader["StudentId"];//为节点的tag属性赋值,便于查找
string
studentName=(string)datareader["StudentName"];//读取datareader中的内容,为字符串studentName赋初值
string
studentNo=(string)datareader["StudentNO"];
string
userState
=
(int)datareader["UserStateId"]
==
1
?
"活动"
:
"非活动";//判断(int)datareader["UserStateId"]是否为1,是则把"活动"赋值给userState
,否则赋值"非活动"
lviStudent.SubItems.AddRange(new
string[]
{
studentName,
studentNo,
userState
});//这个是更新节点信息的

④ 如何在listview的item中内嵌瀑布流哦

那么本篇文章是我们ListView系列三部曲的最后一篇,在这篇文章当中我们将对ListView进行功能扩展,让它能够以瀑布流的样式来显示数据。另外,本篇文章的内容比较复杂,且知识点严重依赖于前两篇文章,如果你还没有阅读过的话,强烈建议先去阅读 Android ListView工作原理完全解析,带你从源码的角度彻底理解 和 Android ListView异步加载图片乱序问题,原因分析及解决方案 这两篇文章。

一直关注我博客的朋友们应该知道,其实在很早之前我就发布过一篇关于实现瀑布流布局的文章,Android瀑布流照片墙实现,体验不规则排列的美感。但是这篇文章中使用的实现算法比较简单,其实就是在外层嵌套一个ScrollView,然后按照瀑布流的规则不断向里面添加子View,原理如下图所示:

虽说功能是可以正常实现,但是这种实现原理背后的问题太多了,因为它只会不停向ScrollView中添加子View,而没有一种合理的回收机制,当子View无限多的时候,整个瀑布流布局的效率就会严重受影响,甚至有可能会出现OOM的情况。

而我们在前两篇文章中对ListView进行了深层次的分析,ListView的工作原理就非常巧妙,它使用RecycleBin实现了非常出色的生产者和消费者的机制,移出屏幕的子View将会被回收,并进入到RecycleBin中进行缓存,而新进入屏幕的子View则会优先从RecycleBin当中获取缓存,这样的话不管我们有多少条数据需要显示,实际上屏幕上的子View其实也就来来回回那么几个。

那么,如果我们使用ListView工作原理来实现瀑布流布局,效率问题、OOM问题就都不复存在了,可以说是真正意义上实现了一个高性能的瀑布流布局。原理示意图如下所示:

OK,工作原理确认了之后,接下来的工作就是动手实现了。由于瀑布流这个扩展对ListView整体的改动非常大,我们没办法简单地使用继承来实现,所以只能先将ListView的源码抽取出来,然后对其内部的逻辑进行修改来实现功能,那么我们第一步的工作就是要将ListView的源码抽取出来。但是这个工作并不是那么简单的,因为仅仅ListView这一个单独的类是不能够独立工作的,我们如果要抽取代码的话还需要将AbsListView、AdapterView等也一起抽取出来,然后还会报各种错误都需要一一解决,我当时也是折腾了很久才搞定的。所以这里我就不带着大家一步步对ListView源码进行抽取了,而是直接将我抽取好的工程UIListViewTest上传到了CSDN,大家只需要点击 这里 进行下载就可以了,今天我们所有的代码改动都是在这个工程的基础上进行的。

另外需要注意的是,为了简单起见,我没有抽取最新版本的ListView代码,而是选择了Android 2.3版本ListView的源码,因为老版本的源码更为简洁,方便于我们理解核心的工作流程。

⑤ C# asp.net WebForm 的三层架构配合ListView实现增删改查源码

C# asp.net WebForm 的三层架构配合ListView实现增删改查源码:
1、用Access新建一个表MResume,人事管理表:
ID 姓名 性别 出生日期 工作年限 证件类型 证件号 居住地 Email 手机号码 家庭电话 图片 自我评价
2、控件的使用:bindingNavigator(实现分页功能), dataGridView(显示数据)
在C# WinForm 中有这一个app.config的文件,这个文件的作用可以当作web程序中的webconfig文件。
这里面可以记录数据库连接字符串
Access下数据库连接函数:
public static OleDbConnection GetConnection()
{
OleDbConnection conn = null;
string strconnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "database\\chinabase.mdb;Persist Security Info=True";
try
{
conn = new OleDbConnection(strconnectionString);
}
catch (Exception ex)
{
throw ex;
}
return conn;
}
3、把数据库中的数据读到dataGridView让这个控件来显示数据:
private void ResumeTest_Load(object sender, EventArgs e)
{
//手动代码把数据库中的数据显示出来
OleDbConnection conn = GetConnection();
string sqlText = "select 姓名,性别,出生日期,工作年限,证件类型,证件号,居住地,Email,手机号码,家庭电话,自我评价 from MResume order by id asc";
OleDbCommand cmd = new OleDbCommand(sqlText, conn);
try
{
conn.Open();
//int i = cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
OleDbDataAdapter oda = new OleDbDataAdapter(sqlText, conn);
DataSet ds = new DataSet();
// oda.Fill(dt);
// dataGridView1.DataSource = dt;
oda.Fill(ds, "ds");

dtInfo.Clear();

//dtInfo = null;
dtInfo = ds.Tables[0];
InitDataSet(dtInfo); //初始化数据
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
//设置GridView样式
// SetUpDataGridView();
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //使用户能够选择行
this.dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; //双击不能修改了,这是通过编程的方式来修改单元格内容的
this.ComboxSelect.Items.Add("请选择类别");
this.ComboxSelect.Items.Add("姓名");
this.ComboxSelect.Items.Add("性别");
this.ComboxSelect.SelectedText = "请选择类别";
}
更新代码如下:
private void 修改ToolStripMenuItem_Click(object sender, EventArgs e)
{
dataGridView1_DoubleClick(sender, e);
//类似于dataGridView的更新操作,也就是双击操作
}
private void dataGridView1_CellMouseDown(object
e)
{
//判断如果点击的是鼠标右键
if (e.Button == MouseButtons.Right)
{
//判断鼠标点击在数据行上
if (e.RowIndex >= 0)
{
dataGridView1.ClearSelection();
dataGridView1.Rows[e.RowIndex].Selected = true;
dataGridView1.CurrentCell
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
}
}
}
删除代码如下:
public bool deletDataGridViewOneLine(object sender, EventArgs e)
{
bool result = false;
Int32 selectedRowCount
dataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected);
int selectedRow = dataGridView1.SelectedRows[0].Index; //获得选中的某行
string MName = dataGridView1.Rows[selectedRow].Cells[0].Value.ToString().Trim();
// MessageBox.Show(MName.ToString());
DialogResult dr = MessageBox.Show("确定要删除这条记录吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
if (MName != null && MName != "")
{
OleDbConnection conn = GetConnection();

string sqlText = "delete from MResume where 姓名=@MName";

OleDbCommand cmd = new OleDbCommand(sqlText, conn);

cmd.Parameters.AddWithValue("@MName", MName);
try
{
conn.Open();
int i = cmd.ExecuteNonQuery();
result = true;
}
catch (Exception ex)
{
MessageBox.Show("发生异常:" + ex.ToString(), "提示");
}
查询代码如下:

private void btnSelect_Click(object sender, EventArgs e)
{
//首先进行模糊查询
string strComboxSelect = ComboxSelect.Text.Trim();
string strSearch = txtSearch.Text.Trim();
if(strComboxSelect.Equals("请选择类别"))
{
MessageBox.Show("请选择类别!","提示");
return;
}
if (strSearch == "" || strSearch == null)
{
MessageBox.Show("请输入查询内容!", "提示");
return;
}
//手动代码把数据库中的数据显示出来
OleDbConnection conn = GetConnection();
string sqlText = "select 姓名,性别,出生日期,工作年限,证件类型,证件号,居住地,Email,手机号码,家庭电话,自我评价 from MResume where " + strComboxSelect + " like '%"+@strSearch+"%'";
OleDbCommand cmd = new OleDbCommand(sqlText, conn);
cmd.Parameters.AddWithValue("@strSearch", strSearch);
try
{
conn.Open();
//int i = cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
OleDbDataAdapter oda = new OleDbDataAdapter(sqlText, conn);
oda.Fill(dt);
dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

⑥ 写了一个用listview显示数据库的例子,但是怎么也显示不出来。源码放出来给大家看

错误截图太少,你看看是不是cursor为空,或者你重新截图多一点我看看

⑦ 如何在ListView中嵌套ListView

如果你是想实现类似QQ微信的好友分组的话,那麻烦你用ExpandableList

这个并不是ListView里嵌套ListView

如果你非要嵌套,也不是不行,子ListView必须要设置它的高度,即要展开所有item,否则滑动不了的

展开所有item的ListView,我这有现成的,在xml里用这个去声明吧

⑧ 求android Listview代码,就是一个列表,点击一个Item然后跳转到另一个页面,类似点餐那种..

给listView注册一个ItemClick事件

listView.setOnItemClickListener(itemClick);

java">/**
*列表条目点击事件
*/
privateAdapterView.OnItemClickListeneritemClick=newAdapterView.OnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){

Intentintent=newIntent(context,Activity.class);

startActivity(intent);
}
};

⑨ android sqlite中 数据库存入图片名称,查询得到cursor数据,求放入listview的源码

代码:
if(username.length()>0&&password.length()>0)
{
SQLiteAdapter db=new SQLiteAdapter(Main.this);
db.openToWrite();
if(db.Login(username,password))
{
System.out.println("goutham");
Intent intent=new Intent(getApplicationContext(),ExampleActivity.class);

startActivity(intent);
}

⑩ c# wimform重写ListView实现组Groups折叠效果,不会重写,望高手给个重写的源码,谢谢了!

你自己写吧,就是一个panel里面放几个button,然后被点开的button下面有一个listview,计算好button与listview的位置和大小就行了

热点内容
普通投资者如何配置富国基金 发布:2024-10-28 23:35:23 浏览:644
世界资产配置是什么 发布:2024-10-28 23:23:03 浏览:530
2022款轩逸哪个配置性比价高 发布:2024-10-28 23:21:25 浏览:956
专业java就业培训 发布:2024-10-28 22:59:52 浏览:121
安卓手机声卡转换器哪个好 发布:2024-10-28 22:57:39 浏览:10
公积金怎么查询账号密码 发布:2024-10-28 22:43:33 浏览:156
电视路由器哪里是网络密码 发布:2024-10-28 22:43:32 浏览:827
python爬虫教程pdf 发布:2024-10-28 22:39:15 浏览:893
哪个微信安卓版本好用 发布:2024-10-28 22:22:10 浏览:342
net调用java接口 发布:2024-10-28 22:21:58 浏览:475