SwipeRefreshLayout

Struct SwipeRefreshLayout 

Source
pub struct SwipeRefreshLayout { /* private fields */ }
Expand description

A SwipeRefreshLayout provides pull-to-refresh functionality

Implementations§

Source§

impl SwipeRefreshLayout

Source

pub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>

Create a new SwipeRefreshLayout

Source

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}
Source

pub fn view(&self) -> &View

Get the underlying View

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V