pub struct SwipeRefreshLayout { /* private fields */ }Expand description
A SwipeRefreshLayout provides pull-to-refresh functionality
Implementations§
Source§impl SwipeRefreshLayout
impl SwipeRefreshLayout
Sourcepub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>
pub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>
Create a new SwipeRefreshLayout
Sourcepub fn id(&self) -> i64
pub fn id(&self) -> i64
Get the view ID
Examples found in repository?
examples/swipe_refresh_demo_v2.rs (line 21)
10fn main() -> Result<()> {
11 println!("=== SwipeRefreshLayout 下拉刷新演示 (新库版本) ===\n");
12
13 // 创建 Activity(全屏模式)
14 let mut activity = Activity::new(false)?;
15 println!("✓ 连接建立\n");
16
17 // 创建 SwipeRefreshLayout 作为根视图
18 let swipe_refresh = activity.create_swipe_refresh_layout(None)?;
19
20 // 在 SwipeRefreshLayout 内创建 LinearLayout(只能有一个子视图)
21 let layout = activity.create_linear_layout(Some(swipe_refresh.id()))?;
22 // ⚠️ 重要:不要在SwipeRefreshLayout的直接子View上设置margin,会导致termux-gui崩溃!
23 // 可以在LinearLayout的子View上设置margin
24
25 // 标题
26 let title = activity.create_text_view("🔄 下拉刷新演示", Some(layout.id()))?;
27 title.set_text_size(&mut activity, 26)?;
28 title.view().set_margin(&mut activity, 10)?;
29 title.view().set_height_wrap_content(&mut activity)?;
30 title.view().set_linear_layout_params(&mut activity, 0, None)?;
31
32 // 说明
33 let desc = activity.create_text_view("向下拉动页面触发刷新", Some(layout.id()))?;
34 desc.view().set_margin(&mut activity, 5)?;
35 desc.view().set_height_wrap_content(&mut activity)?;
36 desc.view().set_linear_layout_params(&mut activity, 0, None)?;
37
38 // 分隔线
39 let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
40 divider1.view().set_margin(&mut activity, 10)?;
41 divider1.view().set_height_wrap_content(&mut activity)?;
42 divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
43
44 // 刷新计数器
45 let refresh_count = activity.create_text_view("刷新次数: 0", Some(layout.id()))?;
46 refresh_count.set_text_size(&mut activity, 24)?;
47 refresh_count.view().set_margin(&mut activity, 10)?;
48 refresh_count.view().set_height_wrap_content(&mut activity)?;
49 refresh_count.view().set_linear_layout_params(&mut activity, 0, None)?;
50 refresh_count.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
51
52 // 最后刷新时间
53 let last_time = activity.create_text_view("最后刷新: 尚未刷新", Some(layout.id()))?;
54 last_time.view().set_margin(&mut activity, 10)?;
55 last_time.view().set_height_wrap_content(&mut activity)?;
56 last_time.view().set_linear_layout_params(&mut activity, 0, None)?;
57 last_time.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
58
59 // 分隔线
60 let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
61 divider2.view().set_margin(&mut activity, 10)?;
62 divider2.view().set_height_wrap_content(&mut activity)?;
63 divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
64
65 // 内容区域标题
66 let content_title = activity.create_text_view("📋 内容列表", Some(layout.id()))?;
67 content_title.set_text_size(&mut activity, 18)?;
68 content_title.view().set_margin(&mut activity, 10)?;
69 content_title.view().set_height_wrap_content(&mut activity)?;
70 content_title.view().set_linear_layout_params(&mut activity, 0, None)?;
71 content_title.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
72
73 // 内容项
74 let item1 = activity.create_text_view("📄 项目 1", Some(layout.id()))?;
75 item1.view().set_margin(&mut activity, 8)?;
76 item1.view().set_height_wrap_content(&mut activity)?;
77 item1.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let item2 = activity.create_text_view("📄 项目 2", Some(layout.id()))?;
80 item2.view().set_margin(&mut activity, 8)?;
81 item2.view().set_height_wrap_content(&mut activity)?;
82 item2.view().set_linear_layout_params(&mut activity, 0, None)?;
83
84 let item3 = activity.create_text_view("📄 项目 3", Some(layout.id()))?;
85 item3.view().set_margin(&mut activity, 8)?;
86 item3.view().set_height_wrap_content(&mut activity)?;
87 item3.view().set_linear_layout_params(&mut activity, 0, None)?;
88
89 // 分隔线
90 let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
91 divider3.view().set_margin(&mut activity, 10)?;
92 divider3.view().set_height_wrap_content(&mut activity)?;
93 divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
94
95 // 提示信息
96 let info = activity.create_text_view(
97 "💡 向下拉动页面刷新\n或点击下方按钮手动刷新",
98 Some(layout.id())
99 )?;
100 info.view().set_margin(&mut activity, 10)?;
101 info.view().set_height_wrap_content(&mut activity)?;
102 info.view().set_linear_layout_params(&mut activity, 0, None)?;
103 info.set_text_color(&mut activity, 0xFF999999u32 as i32)?;
104
105 // 手动刷新按钮
106 let manual_btn = activity.create_button("🔄 手动刷新", Some(layout.id()))?;
107 manual_btn.view().set_margin(&mut activity, 10)?;
108 manual_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
109
110 println!("✓ 界面创建完成\n");
111 println!("━━━━━━━━━━━━━━━━━━━━━━");
112 println!("提示:");
113 println!(" • 向下拉动页面触发刷新");
114 println!(" • 或点击按钮手动刷新");
115 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
116
117 let mut refresh_counter = 0;
118
119 // 事件循环
120 loop {
121 let event = read_message(activity.event_stream())?;
122 let event_type = event["type"].as_str().unwrap_or("");
123 let event_value = &event["value"];
124
125 match event_type {
126 "destroy" => {
127 println!("\n✓ Activity 已关闭");
128 return Ok(());
129 },
130 "refresh" => {
131 println!("🔄 下拉刷新触发!");
132
133 refresh_counter += 1;
134 refresh_count.set_text(&mut activity, &format!("刷新次数: {}", refresh_counter))?;
135
136 // 更新时间
137 let now = std::time::SystemTime::now()
138 .duration_since(std::time::UNIX_EPOCH)
139 .unwrap()
140 .as_secs();
141 last_time.set_text(&mut activity, &format!("最后刷新: {} 秒", now % 10000))?;
142
143 // 更新内容项
144 item1.set_text(&mut activity, &format!("📄 项目 1 (刷新 #{})", refresh_counter))?;
145 item2.set_text(&mut activity, &format!("📄 项目 2 (刷新 #{})", refresh_counter))?;
146 item3.set_text(&mut activity, &format!("📄 项目 3 (刷新 #{})", refresh_counter))?;
147
148 println!("⏳ 模拟加载中...");
149 thread::sleep(Duration::from_secs(2));
150
151 swipe_refresh.set_refreshing(&mut activity, false)?;
152 println!("✅ 刷新完成!\n");
153 },
154 "click" => {
155 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
156
157 if clicked_id == manual_btn.id() {
158 println!("🔄 手动刷新触发!");
159
160 swipe_refresh.set_refreshing(&mut activity, true)?;
161
162 refresh_counter += 1;
163 refresh_count.set_text(&mut activity, &format!("刷新次数: {}", refresh_counter))?;
164
165 item1.set_text(&mut activity, &format!("📄 项目 1 (刷新 #{})", refresh_counter))?;
166 item2.set_text(&mut activity, &format!("📄 项目 2 (刷新 #{})", refresh_counter))?;
167 item3.set_text(&mut activity, &format!("📄 项目 3 (刷新 #{})", refresh_counter))?;
168
169 println!("⏳ 模拟加载中...");
170 thread::sleep(Duration::from_secs(2));
171
172 swipe_refresh.set_refreshing(&mut activity, false)?;
173 println!("✅ 刷新完成!\n");
174 }
175 },
176 _ => {}
177 }
178 }
179}Sourcepub fn set_refreshing(
&self,
activity: &mut Activity,
refreshing: bool,
) -> Result<()>
pub fn set_refreshing( &self, activity: &mut Activity, refreshing: bool, ) -> Result<()>
Set whether the refresh animation is showing
Call with false after refresh is complete to stop the animation
Examples found in repository?
examples/swipe_refresh_demo_v2.rs (line 151)
10fn main() -> Result<()> {
11 println!("=== SwipeRefreshLayout 下拉刷新演示 (新库版本) ===\n");
12
13 // 创建 Activity(全屏模式)
14 let mut activity = Activity::new(false)?;
15 println!("✓ 连接建立\n");
16
17 // 创建 SwipeRefreshLayout 作为根视图
18 let swipe_refresh = activity.create_swipe_refresh_layout(None)?;
19
20 // 在 SwipeRefreshLayout 内创建 LinearLayout(只能有一个子视图)
21 let layout = activity.create_linear_layout(Some(swipe_refresh.id()))?;
22 // ⚠️ 重要:不要在SwipeRefreshLayout的直接子View上设置margin,会导致termux-gui崩溃!
23 // 可以在LinearLayout的子View上设置margin
24
25 // 标题
26 let title = activity.create_text_view("🔄 下拉刷新演示", Some(layout.id()))?;
27 title.set_text_size(&mut activity, 26)?;
28 title.view().set_margin(&mut activity, 10)?;
29 title.view().set_height_wrap_content(&mut activity)?;
30 title.view().set_linear_layout_params(&mut activity, 0, None)?;
31
32 // 说明
33 let desc = activity.create_text_view("向下拉动页面触发刷新", Some(layout.id()))?;
34 desc.view().set_margin(&mut activity, 5)?;
35 desc.view().set_height_wrap_content(&mut activity)?;
36 desc.view().set_linear_layout_params(&mut activity, 0, None)?;
37
38 // 分隔线
39 let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
40 divider1.view().set_margin(&mut activity, 10)?;
41 divider1.view().set_height_wrap_content(&mut activity)?;
42 divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
43
44 // 刷新计数器
45 let refresh_count = activity.create_text_view("刷新次数: 0", Some(layout.id()))?;
46 refresh_count.set_text_size(&mut activity, 24)?;
47 refresh_count.view().set_margin(&mut activity, 10)?;
48 refresh_count.view().set_height_wrap_content(&mut activity)?;
49 refresh_count.view().set_linear_layout_params(&mut activity, 0, None)?;
50 refresh_count.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
51
52 // 最后刷新时间
53 let last_time = activity.create_text_view("最后刷新: 尚未刷新", Some(layout.id()))?;
54 last_time.view().set_margin(&mut activity, 10)?;
55 last_time.view().set_height_wrap_content(&mut activity)?;
56 last_time.view().set_linear_layout_params(&mut activity, 0, None)?;
57 last_time.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
58
59 // 分隔线
60 let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
61 divider2.view().set_margin(&mut activity, 10)?;
62 divider2.view().set_height_wrap_content(&mut activity)?;
63 divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
64
65 // 内容区域标题
66 let content_title = activity.create_text_view("📋 内容列表", Some(layout.id()))?;
67 content_title.set_text_size(&mut activity, 18)?;
68 content_title.view().set_margin(&mut activity, 10)?;
69 content_title.view().set_height_wrap_content(&mut activity)?;
70 content_title.view().set_linear_layout_params(&mut activity, 0, None)?;
71 content_title.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
72
73 // 内容项
74 let item1 = activity.create_text_view("📄 项目 1", Some(layout.id()))?;
75 item1.view().set_margin(&mut activity, 8)?;
76 item1.view().set_height_wrap_content(&mut activity)?;
77 item1.view().set_linear_layout_params(&mut activity, 0, None)?;
78
79 let item2 = activity.create_text_view("📄 项目 2", Some(layout.id()))?;
80 item2.view().set_margin(&mut activity, 8)?;
81 item2.view().set_height_wrap_content(&mut activity)?;
82 item2.view().set_linear_layout_params(&mut activity, 0, None)?;
83
84 let item3 = activity.create_text_view("📄 项目 3", Some(layout.id()))?;
85 item3.view().set_margin(&mut activity, 8)?;
86 item3.view().set_height_wrap_content(&mut activity)?;
87 item3.view().set_linear_layout_params(&mut activity, 0, None)?;
88
89 // 分隔线
90 let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
91 divider3.view().set_margin(&mut activity, 10)?;
92 divider3.view().set_height_wrap_content(&mut activity)?;
93 divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
94
95 // 提示信息
96 let info = activity.create_text_view(
97 "💡 向下拉动页面刷新\n或点击下方按钮手动刷新",
98 Some(layout.id())
99 )?;
100 info.view().set_margin(&mut activity, 10)?;
101 info.view().set_height_wrap_content(&mut activity)?;
102 info.view().set_linear_layout_params(&mut activity, 0, None)?;
103 info.set_text_color(&mut activity, 0xFF999999u32 as i32)?;
104
105 // 手动刷新按钮
106 let manual_btn = activity.create_button("🔄 手动刷新", Some(layout.id()))?;
107 manual_btn.view().set_margin(&mut activity, 10)?;
108 manual_btn.view().set_linear_layout_params(&mut activity, 0, None)?;
109
110 println!("✓ 界面创建完成\n");
111 println!("━━━━━━━━━━━━━━━━━━━━━━");
112 println!("提示:");
113 println!(" • 向下拉动页面触发刷新");
114 println!(" • 或点击按钮手动刷新");
115 println!("━━━━━━━━━━━━━━━━━━━━━━\n");
116
117 let mut refresh_counter = 0;
118
119 // 事件循环
120 loop {
121 let event = read_message(activity.event_stream())?;
122 let event_type = event["type"].as_str().unwrap_or("");
123 let event_value = &event["value"];
124
125 match event_type {
126 "destroy" => {
127 println!("\n✓ Activity 已关闭");
128 return Ok(());
129 },
130 "refresh" => {
131 println!("🔄 下拉刷新触发!");
132
133 refresh_counter += 1;
134 refresh_count.set_text(&mut activity, &format!("刷新次数: {}", refresh_counter))?;
135
136 // 更新时间
137 let now = std::time::SystemTime::now()
138 .duration_since(std::time::UNIX_EPOCH)
139 .unwrap()
140 .as_secs();
141 last_time.set_text(&mut activity, &format!("最后刷新: {} 秒", now % 10000))?;
142
143 // 更新内容项
144 item1.set_text(&mut activity, &format!("📄 项目 1 (刷新 #{})", refresh_counter))?;
145 item2.set_text(&mut activity, &format!("📄 项目 2 (刷新 #{})", refresh_counter))?;
146 item3.set_text(&mut activity, &format!("📄 项目 3 (刷新 #{})", refresh_counter))?;
147
148 println!("⏳ 模拟加载中...");
149 thread::sleep(Duration::from_secs(2));
150
151 swipe_refresh.set_refreshing(&mut activity, false)?;
152 println!("✅ 刷新完成!\n");
153 },
154 "click" => {
155 let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
156
157 if clicked_id == manual_btn.id() {
158 println!("🔄 手动刷新触发!");
159
160 swipe_refresh.set_refreshing(&mut activity, true)?;
161
162 refresh_counter += 1;
163 refresh_count.set_text(&mut activity, &format!("刷新次数: {}", refresh_counter))?;
164
165 item1.set_text(&mut activity, &format!("📄 项目 1 (刷新 #{})", refresh_counter))?;
166 item2.set_text(&mut activity, &format!("📄 项目 2 (刷新 #{})", refresh_counter))?;
167 item3.set_text(&mut activity, &format!("📄 项目 3 (刷新 #{})", refresh_counter))?;
168
169 println!("⏳ 模拟加载中...");
170 thread::sleep(Duration::from_secs(2));
171
172 swipe_refresh.set_refreshing(&mut activity, false)?;
173 println!("✅ 刷新完成!\n");
174 }
175 },
176 _ => {}
177 }
178 }
179}Auto Trait Implementations§
impl Freeze for SwipeRefreshLayout
impl RefUnwindSafe for SwipeRefreshLayout
impl Send for SwipeRefreshLayout
impl Sync for SwipeRefreshLayout
impl Unpin for SwipeRefreshLayout
impl UnwindSafe for SwipeRefreshLayout
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more