React-native-swipe-list-view: How to use with a transparent background?

Created on 9 Sep 2016  路  10Comments  路  Source: jemise111/react-native-swipe-list-view

Hi,

We want to use SwipeRow with a transparent background. If we set content style:

backgroundColor: rgba(0, 0, 0, .1)

Then, the hiddenView will be displayed, it's not what we want. We want it just like Notification Center of IOS, Be displayed only when slid open.

Do you have some idea to resolve this? Thank you.

Most helpful comment

Okay, I got it to work. I'm not sure if this is the best approach, but I moved the TouchableOpacity to the renderHiddenItem. Roughly:

          renderHiddenItem={ (data, rowMap) => 
            <View style={{ alignItems: 'flex-end', bottom: 0, justifyContent: 'center', position: 'absolute', top: 0, width: "100%" }}>
              <View style={{ flex: 1, flexDirection: "row", width: 150 }}>
                <TouchableOpacity
                  style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}
                  onPress={async () => this.delete(data)}
                />
                <TouchableOpacity
                  style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}
                  onPress={async () => this.report(data)}
                />
              </View>
            </View>
             }
          renderItem={({item, rowMap}) => {
            return (
          <View style={{
            flex: 1,
            flexDirection: "row",
            padding: 10,
            justifyContent: "center",
            width: "100%",
          }}>
            <TouchableOpacity onPress={ async () => { this.onClickItem(item) }}>
              <View style={{
                padding: 15,
                borderRadius: 15,
              }}>
                <Text>Hello World</Text>
              </View>
            </TouchableOpacity>
              <View style={{
                position: "absolute",
                top: 0,
                bottom: 0,
                right: -150,
              }}>
                <View style={{flex: 1, flexDirection: "row", width: 150}}>
                  <View style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}>
                    <Text>
                      Hide
                    </Text>
                  </View>
                  <View style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}>
                    <Text>
                      Report
                    </Text>
                  </View>
                </View>
              </View>
          </View>
            );
          }}
          rightOpenValue={-150}

All 10 comments

Hey @TossShinHwa. Yeah with the way this is set up that wouldn't currently be possible. The "hiddenRow" in that example is really alongside the row, not behind it. You may have some luck using this with some styling..

https://github.com/dancormier/react-native-swipeout

Any updates or suggestions? It's very uncomfortable not to be able to do that

@mi-mazouz I made a workaround using the hidden view as a empty View
and using the top view with full width and another view aside.
=(

@mi-mazouz I made a workaround using the hidden view as a empty View
and using the top view with full width and another view aside.
=(

Mind can i ask how ?

I'm also interested in this because it basically means we can't have an ImageBackground behind the SwipeListView. @jemise111's comment from 2016 points to a deprecated alternative (which actually ends up pointing back to this component).

Based on @fukhaos's comment, I'm able to show the items properly but their TouchableOpacity doesn't work even though zIndex is high:

  renderHiddenItem={ (data, rowMap) => <View /> }
  renderItem={({item, rowMap}) => {
    return (
          <View style={{
            flex: 1,
            flexDirection: "row",
            padding: 10,
            justifyContent: "center",
            width: "100%",
          }}>
            <TouchableOpacity onPress={ async () => { this.onClickItem(item) }}>
              <View style={{
                backgroundColor: chipColor,
                padding: 15,
                borderRadius: 15,
              }}>
                <Text>Hello World</Text>
              </View>
            </TouchableOpacity>
            <View style={{ position: "absolute", height: "100%", right: -150, zIndex: 1000 }}>
                <View style={{flex: 1, flexDirection: "row", width: 150}}>
                  <TouchableOpacity style={[styles.swipeOutButton, styles.swipeOutButtonRed]}>
                    <Text
                      style={[styles.swipeOutButtonRedText, styles.font_normal]}
                      onPress={async () => this.delete(item)}
                    >
                      Delete
                    </Text>
                  </TouchableOpacity>
                  <TouchableOpacity style={[styles.swipeOutButton, styles.swipeOutButtonOrange]}>
                    <Text
                      style={[styles.swipeOutButtonRedText, styles.font_normal]}
                      onPress={async () => this.report(item)}
                    >
                      Report
                    </Text>
                  </TouchableOpacity>
                </View>
              </View>
          </View>
    );
  }

Okay, I got it to work. I'm not sure if this is the best approach, but I moved the TouchableOpacity to the renderHiddenItem. Roughly:

          renderHiddenItem={ (data, rowMap) => 
            <View style={{ alignItems: 'flex-end', bottom: 0, justifyContent: 'center', position: 'absolute', top: 0, width: "100%" }}>
              <View style={{ flex: 1, flexDirection: "row", width: 150 }}>
                <TouchableOpacity
                  style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}
                  onPress={async () => this.delete(data)}
                />
                <TouchableOpacity
                  style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}
                  onPress={async () => this.report(data)}
                />
              </View>
            </View>
             }
          renderItem={({item, rowMap}) => {
            return (
          <View style={{
            flex: 1,
            flexDirection: "row",
            padding: 10,
            justifyContent: "center",
            width: "100%",
          }}>
            <TouchableOpacity onPress={ async () => { this.onClickItem(item) }}>
              <View style={{
                padding: 15,
                borderRadius: 15,
              }}>
                <Text>Hello World</Text>
              </View>
            </TouchableOpacity>
              <View style={{
                position: "absolute",
                top: 0,
                bottom: 0,
                right: -150,
              }}>
                <View style={{flex: 1, flexDirection: "row", width: 150}}>
                  <View style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}>
                    <Text>
                      Hide
                    </Text>
                  </View>
                  <View style={{ flex: 1, alignItems: "center", justifyContent: "center", width: 75 }}>
                    <Text>
                      Report
                    </Text>
                  </View>
                </View>
              </View>
          </View>
            );
          }}
          rightOpenValue={-150}

One additional comment is that my renderItem previously used a PureComponent, but with this required View wrapper to add the buttons, I didn't immediately realize why my list rendered more slowly. I had to convert the renderItem to a PureComponent.

I archive this here:
https://vimeo.com/391505451
in 52 seconds.

I've found a much easier solution.

Just use the React Native Gesture Handler library. Works much better and renders the hidden component correctly even when the list item has a transparent background.

Watch this tutorial : https://www.youtube.com/watch?v=JxN9W9PRlUQ

Was this page helpful?
0 / 5 - 0 ratings

Related issues

jwilliamson-qb picture jwilliamson-qb  路  3Comments

ramisalem picture ramisalem  路  5Comments

benoitvallon picture benoitvallon  路  6Comments

imsam67 picture imsam67  路  5Comments

baicuhaha picture baicuhaha  路  6Comments