swipe_refresh_demo_v2/
swipe_refresh_demo_v2.rs

1// SwipeRefreshLayout 下拉刷新演示 - 使用新库 API
2// 展示如何使用 SwipeRefreshLayout 实现下拉刷新
3// 运行: cargo run --example swipe_refresh_demo_v2 --release
4
5use termux_gui::{Activity, Result};
6use termux_gui::connection::read_message;
7use std::time::Duration;
8use std::thread;
9
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}