當前位置:首頁 » 操作系統 » 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-29 01:20:57 瀏覽:520
兒童節編程 發布:2024-10-29 01:20:22 瀏覽:244
搭建和平精英伺服器教程 發布:2024-10-29 00:51:27 瀏覽:311
武漢理工大學認證伺服器地址失敗 發布:2024-10-29 00:38:58 瀏覽:783
c語言單片機什麼意思 發布:2024-10-29 00:22:03 瀏覽:299
php發送郵件亂碼 發布:2024-10-29 00:19:24 瀏覽:60
我的世界java版怎麼免費創伺服器 發布:2024-10-29 00:19:22 瀏覽:279
分期樂在哪裡上傳資料 發布:2024-10-29 00:10:16 瀏覽:244
編譯器確定 發布:2024-10-28 23:56:27 瀏覽:416
如何存儲數據的 發布:2024-10-28 23:49:51 瀏覽:756